如何为QAction设置Shift+鼠标滚轮对应的QKeySequence快捷键
实现Shift+滚轮触发QAction的方案说明
能否使用QKeySequence直接设置快捷键?
不能。QKeySequence仅支持定义纯键盘按键的组合,无法匹配鼠标滚轮这类鼠标输入事件,因此不能直接作为QAction的快捷键使用。
无需重写wheelEvent的简洁实现方案
使用事件过滤器是最轻量化的实现方式,无需子类化对应部件重写事件方法,仅需少量代码即可完成:
- 步骤1:为需要响应Shift+滚轮操作的目标部件(或全局QApplication实例)安装事件过滤器
- 步骤2:在事件过滤器方法中拦截滚轮事件,同时判断Shift修饰符是否按下
- 步骤3:匹配成功后直接调用对应QAction的
trigger()方法触发动作
代码示例(C++ Qt)
// 主窗口构造函数中为目标部件安装事件过滤器 ui->editorWidget->installEventFilter(this); // 重写主窗口的eventFilter方法 bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if (watched == ui->editorWidget && event->type() == QEvent::Wheel) { QWheelEvent *wheelEvt = static_cast<QWheelEvent*>(event); // 判断是否按下Shift键 if (wheelEvt->modifiers() & Qt::ShiftModifier) { int scrollDelta = wheelEvt->angleDelta().y(); if (scrollDelta > 0) { // 滚轮向上,触发向上动作 m_shiftScrollUpAct->trigger(); } else { // 滚轮向下,触发向下动作 m_shiftScrollDownAct->trigger(); } // 如需要保留部件原有的Shift+滚轮默认行为,可改为返回false return true; } } return QMainWindow::eventFilter(watched, event); }
代码示例(PyQt/PySide)
# 为目标部件安装事件过滤器 self.editor_widget.installEventFilter(self) def eventFilter(self, watched: QObject, event: QEvent) -> bool: if watched == self.editor_widget and event.type() == QEvent.Type.Wheel: wheel_evt: QWheelEvent = event if wheel_evt.modifiers() & Qt.KeyboardModifier.ShiftModifier: delta = wheel_evt.angleDelta().y() self.scroll_up_act.trigger() if delta > 0 else self.scroll_down_act.trigger() # 不需要拦截默认行为时改为返回False即可 return True return super().eventFilter(watched, event)
内容的提问来源于stack exchange,提问作者Gatien G.
相关产品推荐
相关产品推荐

