【问题标题】:Qt: open context menu on mouse pressQt:在鼠标按下时打开上下文菜单
【发布时间】:2011-07-18 22:38:37
【问题描述】:

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

有什么想法吗?

谢谢。

【问题讨论】:

  • 只是为了确定,您希望从任何小部件释放鼠标按钮时触发一个菜单,或者您希望每个小部件都有自己的菜单(就像它一样)但更改默认值他们的行为?
  • 我希望我的应用程序的每个上下文菜单都在鼠标按下事件时触发(鉴于它是 Mac OS X 上应用程序的行为,我认为有一个标志或选项可以为其他平台设置) .
  • 顺便说一句,这不会破坏其他操作系统用户的习惯吗?我真的不喜欢在他们的环境中不能正常运行的应用程序,这真的破坏了用户体验。
  • 对于一个广泛分布的软件,我完全同意。在这种情况下,这是来自用户的特定要求,他们在我们正在重新开发的软件的先前版本中已经习惯了这种行为。

标签: c++ qt4 contextmenu


【解决方案1】:

当我意识到将ActionsContextMenu 策略与小部件直接拥有的操作一起使用时,我正试图在QWidget 之上实现一个小部件,并使用自定义方式来处理上下文菜单以满足您的需求期待。 (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。但要小心 QMenuvoid mouseReleaseEvent( QMouseEvent *event) 已经从 QWidget 重新实现,并且可能会做一些你想要保留的东西!


编辑 这有点可悲,但这种行为似乎与 Windows 上的 设计不同,void QMenu::mouseReleaseEvent(QMouseEvent *e) 执行以下操作:

提取形式qmenu.cpp,Qt 4.6.2 sdk

#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() 在生活中做了什么,但很明确的是,只有左键释放才会触发当前动作......

对您来说一个简单的解决方案是重新实现您的QMenu 并注释此行...

【讨论】:

  • 使用上下文菜单策略Qt::ActionsContextMenu 只是更改菜单中使用的QActions,而不是菜单本身的显示行为。顺便说一句,我在 Windows 上使用 Qt 4.5。
  • 好吧,没有尝试所有策略,只是说在公布的配置中我得到了你所期望的确切行为......虽然不知道它是否是 linux/mac 特定的,但如果它出来了对于 4.6 及更高版本的盒子,更新您的 Qt 可能是一件值得考虑的事情,不是吗?
  • 是的,问题是这不是我升级到新版本的要求。我将尝试使用 4.7,如果它有效,我会强烈建议升级到客户端。谢谢。 (如果几天内没有最佳答案,我会将您的答案标记为已接受)。
  • 检查后似乎行为来自操作系统,而不是 Qt 版本。
  • 对,但问题不是触发动作(释放时这样做对我来说很好),而是在按下时弹出上下文菜单。
【解决方案2】:

听起来您需要基于QMenu 创建自己的类,并将其用于程序中的每个上下文菜单。

查看here 以获取参考。

【讨论】:

  • 如果这是唯一的方法,听起来我不会喜欢它... ;)
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多