我使用的Qt4 QPushButton
与QMenu
在它(通过设置setMenu()
我需要在一些无关的事件发生时,显示该菜单。
方法QPushButton::showMenu()
这样做,但它会阻止,直到用户关闭菜单。 QMenu::show()
也这样做,但它显示在屏幕的左上角的菜单。
我怎样才能使编程菜单显示正确定位,也不会妨碍?
我使用的Qt4 QPushButton
与QMenu
在它(通过设置setMenu()
我需要在一些无关的事件发生时,显示该菜单。
方法QPushButton::showMenu()
这样做,但它会阻止,直到用户关闭菜单。 QMenu::show()
也这样做,但它显示在屏幕的左上角的菜单。
我怎样才能使编程菜单显示正确定位,也不会妨碍?
QMenu
是QWidget
。 所以,你可以调用move()
之前show()
您可以使用
void QMenu::popup ( const QPoint & p, QAction * atAction = 0 )
所以
显示菜单,所以操作atAction将在指定的全局位置p。 要翻译一个小部件的本地坐标转换为全局坐标,使用了QWidget :: mapToGlobal()。
不,我不喜欢这个建议的解决方案,因为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);
}