根据自定义快捷方式触发操作
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);
}
}
};
假设我有一些动作要发生。为此,我可以创建一个 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);
}
}
};