【问题标题】:Triggering an action based on its custom shortcut根据其自定义快捷方式触发操作
【发布时间】:2019-06-07 17:55:28
【问题描述】:

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

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

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

我怎样才能做到这一点?

【问题讨论】:

  • 我不知道怎么做。但听起来像一个糟糕的 UI 设计。
  • @GeneCode 我对 OP 的应用了解不多,无法投票支持或反对您的声明...
  • 一个按钮用于单击左键。任何其他异常都是糟糕的 UI 设计。从用户的角度来看,它不容易理解。但这不在主题范围内。

标签: qt user-interface qt5 action hotkeys


【解决方案1】:

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

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

【讨论】:

  • 我应该如何将mouseEvt-&gt;button()mouseEvt-&gt;modifiers() 与操作列表进行比较?
  • 谢谢,会试试的。我也有疑问 - 绑定之一是 Alt + 鼠标左键。但是在 Linux 上,该组合被窗口管理器捕获,并且无法到达我的小部件。我如何才能真正在mousePressEvent() 中捕捉到该事件?
  • 如果“该组合被窗口管理器捕获并且没有到达我的小部件”Qt 无法知道它。禁用窗口管理器中的快捷方式或使用(平台相关的)方法来获取鼠标状态。 (搜索“linux mouse hook”)但是在你这样做之前,你应该认真考虑你的方法是否正确。毕竟,如果你分发你的应用程序并且你的窗口系统有一些快捷方式,那么在其他 PC 上也是如此。不要破坏系统用户交互!
  • 好的,顺便说一下,我使用了 Ctrl+Alt+click。这会是个问题吗?
猜你喜欢
  • 2019-12-03
  • 2015-01-19
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多