在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?
答案 0 :(得分:2)
单击该按钮将为其提供键盘焦点,更重要的是,从具有相同快捷键设置的任何其他窗口小部件中移除焦点。
所有可编辑的输入小部件(例如QLineEdit
,QTextEdit
等)都有针对各种操作的硬编码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)