如何在QPushButton中显示菜单而不会阻止



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

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

如何以编程方式使菜单正确显示,而不会阻塞?

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

QMenu QWidget .因此,您可以在show()之前致电move()

您可以使用

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

所以

显示菜单,以便操作操作将位于指定的 全球立场 p.将微件的本地坐标转换为 全局坐标,使用 QWidget::mapToGlobal()。

相关内容

  • 没有找到相关文章

最新更新