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

Qt 5.4 Ctrl+Z shortcut conflict in Python? Doesn't work until its button has been pressed

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

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

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

其他具有快捷键 F1F12.

的按钮不会发生这种 'initializing' 行为

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

Try QKeySequence

例如;

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

单击该按钮将为其提供键盘焦点,更重要的是,它会从具有相同快捷方式集的任何其他小部件上移除焦点。

所有可编辑的输入小部件(例如 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)

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