Qt: открыть контекстное меню при нажатии мыши - PullRequest
1 голос
/ 08 июля 2011

Я пытаюсь изменить поведение контекстных меню по умолчанию: вместо открытия по событию отпускания правой кнопки мыши я хочу, чтобы оно открывалось при событии нажатия, и его действия должны запускаться при событии выпуска),В одном виджете я мог бы перегрузить mousePressEvent() и запустить пользовательское событие contextmenu, но я хочу, чтобы оно было глобальным для всех контекстных меню моей программы ...

Есть идеи?

Спасибо.

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Я пытался реализовать базу виджетов поверх 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 с этой прокомментированной строкой ...

1 голос
/ 08 июля 2011

Похоже, вам нужно создать собственный класс на основе QMenu и использовать его для каждого контекстного меню в вашей программе.

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

...