Я пытался реализовать базу виджетов поверх QWidget
с пользовательским способом обработки контекстного меню в соответствии с вашими потребностями, когда я понимаю, что использование политики ActionsContextMenu
с действиями, непосредственно принадлежащими виджету, в точности соответствует вашему поведению ожидаю. (Qt 4.6.2 и 4.7 на linux, еще не пробовал на windows, но я не знаю, почему поведение должно отличаться).
Это политика, которую вы можете использовать? Если вам действительно не нужны внешние меню, я предлагаю воспользоваться этим решением.
В противном случае вам придется создать свою собственную базу виджетов с пользовательским QMenu
членом. Вы должны использовать политику Qt::PreventContextMenu
, чтобы гарантировать щелчок правой кнопкой мыши до void mousePressEvent(QMouseEvent *event)
вашего виджета. В этом обработчике событий обязательно покажите свое меню. В вашем меню повторно внедрите void mouseReleaseEvent( QMouseEvent *event)
, если оно не вызывает текущее действие, сделайте это самостоятельно с помощью позиции мыши (в событии) и QAction* actionAt( const QPoint & pt) const
. Но будьте осторожны, void mouseReleaseEvent( QMouseEvent *event)
из QMenu
уже повторно реализован из QWidget
и может делать некоторые вещи, которые вы хотите сохранить!
EDIT
Это немного грустно, но это поведение кажется отличным в Windows void QMenu::mouseReleaseEvent(QMouseEvent *e)
делает следующее:
Извлеченная форма qmenu.cpp
, Qt 4.6.2 sdk
#if defined(Q_WS_WIN)
//On Windows only context menus can be activated with the right button
if (e->button() == Qt::LeftButton || d->topCausedWidget() == 0)
#endif
d->activateAction(action, QAction::Trigger);
Я не знаю, что topCausedWidget()
делает в жизни, но очевидно, что только нажатие левой кнопки вызовет текущее действие ...
Одним из простых решений для вас будет повторная реализация вашего QMenu
с этой прокомментированной строкой ...