1

QPushButton我在其中使用Qt4 QMenu(由 设置setMenu())。当一些不相关的事件发生时,我需要显示这个菜单。

方法QPushButton::showMenu()执行此操作,但它会阻塞,直到用户关闭菜单。 QMenu::show()也这样做,但它在屏幕的左上角显示菜单。

如何以编程方式使菜单显示正确定位且不阻塞?

4

3 回答 3

0

QMenuQWidget。所以你可以打电话move()之前show()

于 2014-04-09T08:37:06.273 回答
0

不,我不喜欢建议的解决方案,因为 QPushButton 应该管理菜单位置,而不是调用者。

所以我决定将鼠标向下/向上事件发布到这个 QPushButton 小部件,模拟用户所做的事情。这成功了。这是一种弥补 Qt 中缺失功能的 hack。

void simulateMouseClick(QWidget *widget) {
  QPoint pos(widget->width()/2, widget->height()/2);
  QMouseEvent *evtDown = new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
  QMouseEvent *evtUp   = new QMouseEvent(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
  (void) QApplication::postEvent(widget, evtDown);
  (void) QApplication::postEvent(widget, evtUp);
} 
于 2014-04-09T19:34:47.690 回答
0

您可以使用

void QMenu::popup ( const QPoint & p, QAction * atAction = 0 )

所以

显示菜单,以便操作 atAction 位于指定的全局位置 p。要将小部件的本地坐标转换为全局坐标,请使用 QWidget::mapToGlobal()。

于 2014-04-09T09:07:41.687 回答