Ich möchte Schlüsselereignisse der Pfeiltasten in meiner Anwendung behandeln. Ich habe bereits gelesen, dass dafür der Fokus deaktiviert sein muss. Ich folge dieser Methode: PyQt not recognizing arrow keys. Wenn Sie innerhalb von MyApp.__init__
self.setChildrenFocusPolicy(QtCore.Qt.NoFocus)
(wie im verknüpften Thread und in meinem Quellcode definiert) aufrufen, wird durch Drücken einer Pfeiltaste ein Schlüsselereignis ausgelöst. Ich möchte jedoch nicht den Fokus während der gesamten Laufzeit der Anwendung deaktiviert lassen, sondern nur auf einen Knopf klicken. So bewege ich self.setChildrenFocusPolicy(QtCore.Qt.NoFocus)
auf die Schaltfläche klicken Funktion:Behandeln Pfeiltaste Ereignisse durch Festlegen der Fokusrichtlinie
def __init__(self):
self.pushButton.clicked.connect(self.pushButtonClicked)
def pushButtonClicked(self):
self.setChildrenFocusPolicy(QtCore.Qt.NoFocus)
Tat deaktiviert den Druckknopf schlagen den Fokus (beispielsweise eine Zeile bearbeiten kann nicht den Textcursor mehr nehmen). Durch Drücken einer Pfeiltaste wird jedoch immer noch kein Schlüsselereignis ausgelöst.
Die gesamte Anwendung (Sie werden mit einem Druckknopf eine mainwindow.ui benötigen):
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_())
Das funktioniert. Haben Sie eine Idee, warum die Methode, die im anderen Thread erwähnt wurde, nur innerhalb der '__init__' Funktion funktioniert, aber nicht später? –
@MichaelWestwort. Nicht wirklich, und ich fühle mich nicht gut motiviert, den ganzen Code in dieser Antwort durchzuarbeiten, um zu verstehen, was es zu tun versucht ;-) Warum musst du es wissen? – ekhumoro