根据自定义快捷方式触发操作

Triggering an action based on its custom shortcut

假设我有一些动作要发生。为此,我可以创建一个 QAction 对象并将其 triggered() 信号连接到执行所需功能的插槽。另外,我可以有一个与动作关联的快捷方式;通过更改快捷方式,我将能够使用该快捷方式执行相同的操作。

我现在的问题是 "shortcut" 我想设置为动作,还包含鼠标按钮按下(鼠标事件不能分配给动作快捷方式);说我想要 Shift+Left mouse button。也许这听起来有点刺耳,但请耐心等待。

我需要什么?好吧,我有一个按钮和一个动作(比如 "execute a script")。我希望脚本在单击 Shift+Left click 时执行,并且我希望自定义此 "shortcut",即用户应该能够更改为快捷方式,比如 Ctrl+Left click(来自某些 GUI元素,例如按钮文本),现在 Ctrl+Left click 应该执行脚本。

我怎样才能做到这一点?

注意:作为用户,我希望鼠标按钮触发的动作与位置相关。如果是这样,下面会变得更简单一些。

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);
        }
    }
};