我使用带有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()。