Как показать меню в 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().

Другие вопросы по тегам