我理解当父母中存在快捷方式并且孩子想要“违反规则”时会发生QEvent::ShortcutOverride
。 Qt Wiki上给出的示例是一个媒体播放器,它暂停了Space但QLineEdit
可能想要使用Space,这很有意义。
此外,如果事件被接受,则会为子窗口小部件生成QEvent::KeyPress
,以便您可以处理您的特定情况。
现在,我的问题是,为什么在使用标准快捷方式时,默认操作似乎是接受 QEvent::ShortcutOverride
?在我看来,这与名称所暗示的相反,即默认情况下它被覆盖,您必须处理事件以让快捷方式通过。
在下面的代码中,如果您没有安装事件过滤器,则看不到该消息。
from PySide.QtGui import QApplication
from PySide import QtGui, QtCore
app = QApplication([])
class Test(QtGui.QWidget):
def __init__(self, parent=None):
super(Test, self).__init__(parent)
self.setLayout(QtGui.QVBoxLayout())
self.w_edit = QtGui.QLineEdit(parent=self)
self.layout().addWidget(self.w_edit)
# If we install the event filter and ignore() the ShortcutOverride
# then the shortcut works
self.w_edit.installEventFilter(self)
# Ctrl+Left is already in use (jump to previous word)
shortcut = QtGui.QShortcut(QtGui.QKeySequence('Ctrl+Left'), self)
shortcut.setContext(QtCore.Qt.ApplicationShortcut)
shortcut.activated.connect(self.test_slot)
def test_slot(self):
print('ctrl+left pressed!')
def eventFilter(self, obj, event):
if obj is self.w_edit and event.type() == QtCore.QEvent.ShortcutOverride:
# Send the event up the hierarchy
event.ignore()
# Stop obj from treating the event itself
return True
# Events which don't concern us get forwarded
return super(Test, self).eventFilter(obj, event)
widget = Test()
widget.show()
if __name__ == '__main__':
app.exec_()
我的实际场景是一个标签小部件,我想使用Ctrl + Left / Right来循环切换标签,除非QLineEdit
之类的内容具有焦点,否则它会起作用。我觉得应该有一个更好的方法,除了在event->ignore(); return true
和所有可以使用键组合的小部件上调用QLineEdit
之外,我在这里错过了一些东西吗?
谢谢!
答案 0 :(得分:2)
您可以在应用程序实例上设置一个事件过滤器,然后进行相应的过滤:
QtGui.qApp.installEventFilter(self)
# self.w_edit.installEventFilter(self)
...
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.ShortcutOverride:
# filter by source object, source.parent(), or whatever...
if isinstance(source, QtGui.QLineEdit):
event.ignore()
return True
return super(Test, self).eventFilter(source, event)