如何在不阻塞的情况下在QPushButton中显示菜单?

时间:2014-04-08 21:04:38

标签: qt block qpushbutton qmenu

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

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

如何以编程方式使菜单正确定位,并且不会阻塞?

3 个答案:

答案 0 :(得分:0)

QMenuQWidget。因此,您可以在move()之前致电show()

答案 1 :(得分:0)

您可以使用

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

所以

  

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

答案 2 :(得分:0)

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

所以我决定将鼠标按下/向上事件发布到此QPushButton小部件,模拟用户的操作。这样做了。这是一个补偿Qt中缺少功能的黑客。

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);
}