Qt:鼠标按下打开上下文菜单

时间:2011-07-08 07:47:26

标签: c++ qt4 contextmenu

我正在尝试更改上下文菜单的默认行为:我没有打开鼠标右键的发布事件,而是希望它在新闻事件中打开,并且它是在发布事件上触发的操作) 。在一个小部件上,我可以重载mousePressEvent()并激活自定义上下文菜单事件,但我希望它对我程序的所有上下文菜单都是全局的...

有什么想法吗?

感谢。

2 个答案:

答案 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() ...