qt - 根据其自定义快捷方式触发操作
问题描述
假设我有一些行动要发生。为此,我可以创建一个QAction
对象并将其triggered()
信号连接到执行所需功能的插槽。另外,我可以有一个与动作相关联的快捷方式;通过更改快捷方式,我将能够使用该快捷方式执行相同的操作。
我现在的问题是我想为动作设置的“快捷方式”还包含鼠标按钮按下(并且鼠标事件不能分配给动作快捷方式);说我想要Shift+Left mouse button
。也许这听起来有点刺耳,但请耐心等待。
我需要什么?好吧,我有一个按钮和一个动作(比如“执行脚本”)。我希望脚本在Shift+Left click
单击时执行,并且我希望自定义此“快捷方式”,即用户应该能够更改为快捷方式,例如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);
}
}
};
推荐阅读
- python - Scrapy 不在 postgresql 列中写入
- xml - Liferay 6.2 rest api,内容类型为 text/xml
- ubuntu - 适用于 Linux 的 Windows 子系统在挂载时忽略元数据选项
- php - 如何使用安全规范发出 Soap 请求
- python-3.x - 尝试从 python 写入 cassandra 时 CQL 查询中的语法错误
- java - 引用变量 DataOutputStream 和 FileOutputStream
- ios - 无法将“字符”类型的值分配给“字符串”类型?
- android - 带有 RecyclerView 顶部和按钮视图的 ConstraintLayout 某些部分是不可见的。
- maven - 如何dockerize一个多模块springboot应用程序?
- typescript - React Native 如何在断点上下文中执行代码