Qt: открыть контекстное меню при нажатии мыши
Я пытаюсь изменить поведение контекстных меню по умолчанию: вместо открытия по событию отпускания правой кнопки мыши, я хочу, чтобы оно открывалось по событию прессы, и его действия запускаются при событии релиза). На одном виджете я мог бы перегрузить mousePressEvent()
и запустить пользовательское событие context menu, но я хочу, чтобы оно было глобальным для всех контекстных меню моей программы...
Есть идеи?
Благодарю.
2 ответа
Я пытался реализовать базу виджетов поверх 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
и может делать что-то, что вы хотите сохранить!
РЕДАКТИРОВАТЬ Это отчасти грустно, но это поведение, кажется, отличается от дизайна на окнах 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
с этой строкой прокомментировал...
Похоже, вам нужно создать свой собственный класс на основе QMenu
и используйте его для каждого контекстного меню в вашей программе.
Проверьте здесь для справки.