首页 > 解决方案 > 根据其自定义快捷方式触发操作

问题描述

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

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

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

我怎样才能做到这一点?

标签: qtuser-interfaceqt5actionhotkeys

解决方案


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

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

推荐阅读