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и используйте его для каждого контекстного меню в вашей программе.

Проверьте здесь для справки.

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