QPushButton
我在其中使用Qt4 QMenu
(由 设置setMenu()
)。当一些不相关的事件发生时,我需要显示这个菜单。
方法QPushButton::showMenu()
执行此操作,但它会阻塞,直到用户关闭菜单。
QMenu::show()
也这样做,但它在屏幕的左上角显示菜单。
如何以编程方式使菜单显示正确定位且不阻塞?
QPushButton
我在其中使用Qt4 QMenu
(由 设置setMenu()
)。当一些不相关的事件发生时,我需要显示这个菜单。
方法QPushButton::showMenu()
执行此操作,但它会阻塞,直到用户关闭菜单。
QMenu::show()
也这样做,但它在屏幕的左上角显示菜单。
如何以编程方式使菜单显示正确定位且不阻塞?
QMenu
是QWidget
。所以你可以打电话move()
之前show()
。
不,我不喜欢建议的解决方案,因为 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);
}
您可以使用
void QMenu::popup ( const QPoint & p, QAction * atAction = 0 )
所以
显示菜单,以便操作 atAction 位于指定的全局位置 p。要将小部件的本地坐标转换为全局坐标,请使用 QWidget::mapToGlobal()。