如何显示没有阻断QPushButton菜单吗?(How to show the menu in QP

2019-10-19 19:09发布

我使用的Qt4 QPushButtonQMenu在它(通过设置setMenu() 我需要在一些无关的事件发生时,显示该菜单。

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

我怎样才能使编程菜单显示正确定位,也不会妨碍?

Answer 1:

QMenuQWidget 。 所以,你可以调用move()之前show()



Answer 2:

您可以使用

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

所以

显示菜单,所以操作atAction将在指定的全局位置p。 要翻译一个小部件的本地坐标转换为全局坐标,使用了QWidget :: mapToGlobal()。



Answer 3:

不,我不喜欢这个建议的解决方案,因为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);
} 


文章来源: How to show the menu in QPushButton without blocking?