我在其中使用Qt4 QPushButton
和QMenu
(由setMenu()
设置)。当发生一些不相关的事件时,我需要显示此菜单。
方法QPushButton::showMenu()
执行此操作,但它会阻止,直到用户关闭菜单。
QMenu::show()
也会执行此操作,但它会在屏幕左上角显示菜单。
如何以编程方式使菜单正确定位,并且不会阻塞?
答案 0 :(得分:0)
QMenu
是QWidget
。因此,您可以在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);
}