Как показать меню в QPushButton без блокировки?
Я использую Qt4 QPushButton
с QMenu
в нем (устанавливается setMenu()
). Мне нужно показать это меню, когда происходит какое-то несвязанное событие.
метод QPushButton::showMenu()
делает это, но блокируется, пока пользователь не закроет меню.QMenu::show()
также делает это, но показывает меню в левом верхнем углу экрана.
Как программно сделать так, чтобы меню отображалось правильно и без блокировки?
3 ответа
Нет, мне не понравились предложенные решения, потому что 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
, Так что вы можете позвонить move()
до show()
,
Ты можешь использовать
void QMenu::popup ( const QPoint & p, QAction * atAction = 0 )
Так
Отображает меню так, чтобы действие atAction находилось в указанной глобальной позиции p. Чтобы преобразовать локальные координаты виджета в глобальные координаты, используйте QWidget::mapToGlobal().