Qt 5.4 Ctrl + Z在Python中的快捷方式冲突?在按下按钮之前不起作用

时间:2015-03-04 18:30:43

标签: python qt keyboard-shortcuts

在Qt Designer 5.4中,我有一个QPushButton并将其快捷方式设置为 Ctrl + Z 。我正在使用pyuic5将其转换为Python代码。这是Python代码中的结果行:

self.quickTextUndoButton.setShortcut(_translate("newEntryDialog", "Ctrl+Z"))

运行应用程序时,按 Ctrl + Z 不会按预期调用插槽,直到按下QPushButton(调用插槽);此后,按 Ctrl + Z 按预期调用插槽。

使用快捷键 F1 F12 的其他按钮不会发生此“初始化”行为。

这是否与 Ctrl + Z 的现有解释发生冲突?如果是这样,是否有一种简单的方法可以避免这种冲突?也许只是恰当地设置ShortcutContext?

2 个答案:

答案 0 :(得分:2)

单击该按钮将为其提供键盘焦点,更重要的是,从具有相同快捷键设置的任何其他窗口小部件中移除焦点。

所有可编辑的输入小部件(例如QLineEditQTextEdit等)都有针对各种操作的硬编码default key bindings,包括 Ctrl + Z (撤消最后一次动作)。如果这样的小部件具有键盘焦点,则其快捷方式将优先于您为按钮设置的快捷方式(反之亦然)。

如果多个窗口小部件具有相同的快捷方式,您可以设置事件过滤器并使用ShortcutOverride消除歧义:

    self.lineEdit.installEventFilter(self)
    ...

def eventFilter(self, source, event):
    if (event.type() == QtCore.QEvent.ShortcutOverride and
        event.modifiers() == QtCore.Qt.ControlModifier and
        event.key() == QtCore.Qt.Key_Z):
        # eat the shortcut on the line-edit
        return True
    return super(Window, self).eventFilter(source, event)

但是,作为用户,我真的讨厌执行此类操作的应用程序。当我使用标准输入小部件时,我希望能够使用所有标准键盘绑定。如果它们没有按预期工作,它看起来就像一个bug。

答案 1 :(得分:0)

  

尝试 QKeySequence

例如;

ctrl_z = "Ctrl+Z"
key_seq = QtGui.QKeySequence(ctrl_z)
btn.setShortcut(key_seq)