通过设置焦点政策处理箭头键事件

时间:2016-10-01 14:39:00

标签: pyqt pyqt4 keyevent qkeyevent

我想在我的应用程序中处理箭头键的关键事件。我已经读过,为此必须禁用焦点。我遵循这种方法:PyQt not recognizing arrow keys。实际上,当在self.setChildrenFocusPolicy(QtCore.Qt.NoFocus)内调用MyApp.__init__(如下面的链接线程和我的源代码中所定义)时,按箭头键会引发一个关键事件。但是,我不希望在应用程序的整个运行时期间禁用焦点,而只是在单击按钮时禁用焦点。所以我将self.setChildrenFocusPolicy(QtCore.Qt.NoFocus)移动到按钮点击功能:

def __init__(self):
    self.pushButton.clicked.connect(self.pushButtonClicked)

def pushButtonClicked(self):
    self.setChildrenFocusPolicy(QtCore.Qt.NoFocus)

实际上,按下按钮会禁用焦点(例如,行编辑不能再使用文本光标)。但是,按箭头键仍然不会引发关键事件。

整个应用程序(你需要一个带按钮的mainwindow.ui):

import sys
from PyQt4 import QtCore, QtGui, uic

qtCreatorFile = "d:/test/mainwindow.ui"

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyApp(QtGui.QMainWindow, Ui_MainWindow):

    def setChildrenFocusPolicy(self, policy):
        def recursiveSetChildFocusPolicy (parentQWidget):
            for childQWidget in parentQWidget.findChildren(QtGui.QWidget):
                childQWidget.setFocusPolicy(policy)
                recursiveSetChildFocusPolicy(childQWidget)
        recursiveSetChildFocusPolicy(self)

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.pushButtonClicked)

    def pushButtonClicked(self):
        self.setChildrenFocusPolicy(QtCore.Qt.NoFocus)

    def keyPressEvent(self, event):
        print "a"

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:2)

无需禁用焦点。您可以通过在应用程序上安装事件过滤器来访问所有关键事件:

class MyApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        ...
        QtGui.qApp.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.KeyPress:
            print(event.key())
        return super(MyApp, self).eventFilter(source, event)

但是请注意,这确实得到了所有,所以你最终可能会得到比你讨价还价更多......