Qt ShortcutOverride默认操作

时间:2015-01-14 14:57:44

标签: python qt pyside

我理解当父母中存在快捷方式并且孩子想要“违反规则”时会发生QEvent::ShortcutOverrideQt 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之外,我在这里错过了一些东西吗?

谢谢!

1 个答案:

答案 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)