Запуск действия на основе его пользовательского ярлыка - PullRequest
0 голосов
/ 13 января 2019

Предположим, у меня есть какое-то действие. Для этого я могу создать объект QAction и подключить его сигнал triggered() к слоту, который выполняет нужную функцию. Кроме того, у меня может быть ярлык, связанный с действием; изменив ярлык, я смогу выполнить то же действие с этим ярлыком.

Моя проблема сейчас заключается в том, что «ярлык», который я хочу установить для действия, содержит также нажатие кнопки мыши (и события мыши не могут быть назначены для ярлыков действий); скажи, что хочу Shift+Left mouse button. Может быть, это звучит немного грубо, но терпите меня.

Что мне нужно? Ну, у меня есть кнопка и действие (скажем, «выполнить скрипт»). Я хочу, чтобы скрипт выполнялся при нажатии Shift+Left click, и я хочу, чтобы этот «ярлык» был настроен, то есть пользователь должен иметь возможность перейти на ярлык, скажем, Ctrl+Left click (из некоторого элемента GUI, например, текста кнопки) и теперь Ctrl+Left click должен выполнить скрипт.

Как мне этого добиться?

1 Ответ

0 голосов
/ 14 января 2019

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

Qt не может указать такой ярлык.

Вы можете бросить свой собственный, реагируя на события мыши:

  • Может быть, у вас есть обработчик событий mousePressEvent(),
  • или универсальный eventFilter(QObject *obj, QEvent *evt),
  • или использовать QApplication::notify

В каком-то месте вам нужно поймать QMouseEvent *mouseEvt.

Выберите виджет (или qApp), который максимально необходим.

Там сравните mouseEvt->button() и mouseEvt->modifiers() с вашим списком действий и запустите выбранное действие. Когда пользователь выберет другой метод триггера, настройте список действий.


Давайте применим это на практике:

class MainWindow : public QWidget {
    Q_OBJECT
public:
    QMap<QPair<Qt::MouseButton, Qt::KeyboardModifiers>, QAction*> mapMouseShortcuts;
    QAction *pLaunchScript;

    MainWindow() : QWidget() {
        mapMouseShortcuts.insert(qMakePair(Qt::LeftButton, Qt::ControlModifier), pLaunchScript);
    }

    void mousePressEvent(QMouseEvent *me) {
        QAction *action = mapMouseShortcuts.value(qMakePair(me->button(), me->modifiers()), Q_NULLPTR);
        if(action != Q_NULLPTR) {
            action->trigger();
            me->accept(); // optional
        }
        // optional:
        if(!me->isAccepted()) {
            QWidget::mousePressEvent(me);
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...