• 7424阅读
  • 6回复

[讨论]QT模拟鼠标选择右键菜单item [复制链接]

上一主题 下一主题
离线丸子
 
只看楼主 倒序阅读 楼主  发表于: 2013-12-16
右键后popup出来的menu里面,想在popup后模拟鼠标自己选择我给他指定的item的action,可是那个QMenu.exec()貌似是在函数内部执行这一步的,在popup后菜单也不显示出来,只是在exec()后才显示,而且要在exec的过程中选择一个item,这个函数才算执行完,才会返回值,下面是exec()的源代码,觉得看完似懂非懂,好像是需要一个一直循环的监视器来监视是否有action发生,可是那个d,看完部分源代码窃以为是QMenuPrivate 但是这个变量是个protected的,所以我想自己用也用不到,自己单有个eventloop也没用。。。。。死活没反应。。。。
QAction *QMenu::exec(const QPoint &p, QAction *action)
{
Q_D(QMenu);
createWinId();
QEventLoop eventLoop;
d->eventLoop = &eventLoop;
popup(p, action);
QPointer<QObject> guard = this;
(void) eventLoop.exec();
if (guard.isNull())
return 0;
action = d->syncAction;
d->syncAction = 0;
d->eventLoop = 0;
return action;
}
离线丸子
只看该作者 1楼 发表于: 2013-12-16
然后我又看到了这两个函数setActiveAction和 activeAction
我就想可不可以提前设置好action,然后直接执行行不行,结果还是没反应。。。。 debug到这里就不动了
QAction * act_set  = new QAction("select all", this);
menu.setActiveAction(act_set);
menu.activeAction();

感觉还是很多源代码认真看的原因,可是一个文件好大,有点不知道从哪里开始下手,能不能有人指点下该怎么下手开始看,感觉还是应该是在exec里面改,可是怎么改头绪不是很清楚。。。
离线dbzhang800

只看该作者 2楼 发表于: 2013-12-16

避免使用 QMenu::exec() 和 QDialog::exec() 这些函数,转而使用 QMenu::popup() 和 QDialog::open() 这些非阻塞的函数。
离线丸子
只看该作者 3楼 发表于: 2013-12-17
回 1楼(dbzhang800) 的帖子
不好意思哈 昨天没看到
我是想用popup弹出以后 然后自己改写exec()内部来接着写,可是写不对 而且如果不加个eventloop的exec 我那个菜单都是闪一下就不见了 我理解是那个eventloop是负责一个监听事件的功能  类似于监视器,然后我想这样去模拟选中了一个item的action
QAction * act_set  = new QAction("select all", this);
         menu.setActiveAction(act_set);
         menu.activeAction();
可是debug的时候走到第一步就不动了
离线dbzhang800

只看该作者 4楼 发表于: 2013-12-17
一闪而过说明用法有问题,比如,你将QMenu放到了栈中,而不是通过new放入堆中。

QMenu *m = new QMenu(this);
m->setAttribute(Qt::WA_DeleteOnClose);
//....
m->popup(...);

大致等价于

QMenu m(this);
//...
m.exec(...);

但是前者可以避免由于事件循环嵌套导致的一系列问题。
离线丸子
只看该作者 5楼 发表于: 2013-12-17
回 4楼(dbzhang800) 的帖子
这样子。。。。。 我还以为是因为没有一个loop所以一闪而过  我再看看~~  谢谢啦!!!!!!!
离线丸子
只看该作者 6楼 发表于: 2013-12-19
回 4楼(dbzhang800) 的帖子
有个问题额。。。。 网上一直搜不出答案~ 为什么popup的时候 submenu出不来 popup出来的menu里只有代表action的item  那些submenu统统不见了
快速回复
限100 字节
 
上一个 下一个