我正在尝试更改上下文菜单的默认行为:我没有打开鼠标右键的发布事件,而是希望它在新闻事件中打开,并且它是在发布事件上触发的操作) 。在一个小部件上,我可以重载mousePressEvent()
并激活自定义上下文菜单事件,但我希望它对我程序的所有上下文菜单都是全局的...
有什么想法吗?
感谢。
答案 0 :(得分:1)
听起来你需要根据QMenu
创建自己的类,并将其用于程序中的每个上下文菜单。
检查here以获取参考。
答案 1 :(得分:1)
当我意识到使用QWidget
策略和小部件直接拥有的操作时,我试图在ActionsContextMenu
之上使用自定义方式处理上下文菜单以满足您的需求。确切地说是你期望的行为。 (关于linux的Qt 4.6.2& 4.7,还没试过Windows,但我不知道为什么行为应该不同)。
这是您可以使用的政策吗?如果您确实需要外部菜单,我建议您使用此解决方案。
否则,您必须使用自定义QMenu
成员创建自己的窗口小部件库。您应该使用Qt::PreventContextMenu
政策来保证右键单击以结束小部件的void mousePressEvent(QMouseEvent *event)
。在此事件处理程序中,请确保显示您的菜单。在您的菜单中重新实现void mouseReleaseEvent( QMouseEvent *event)
如果它不触发当前操作,请使用鼠标位置(在事件中)和QAction* actionAt( const QPoint & pt) const
进行自我操作。但请注意,void mouseReleaseEvent( QMouseEvent *event)
的{{1}}已经从QMenu
重新实施,可能会执行您想要保留的内容!
修改强>
这有点令人伤心,但这种行为似乎与Windows QWidget
执行以下操作设计不同:
提取表格void QMenu::mouseReleaseEvent(QMouseEvent *e)
,Qt 4.6.2 sdk
qmenu.cpp
我不知道#if defined(Q_WS_WIN)
//On Windows only context menus can be activated with the right button
if (e->button() == Qt::LeftButton || d->topCausedWidget() == 0)
#endif
d->activateAction(action, QAction::Trigger);
在生活中的作用,但它明确表示只有左按钮释放才会触发当前动作......
一个简单的解决方案就是使用此行评论重新实施topCausedWidget()
...