2016-10-01 5 views
1

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_()) 

Antwort

1

Es gibt keine Notwendigkeit, Fokus zu deaktivieren. Sie können den Zugriff auf alle wichtigen Ereignisse erhalten, indem über die Anwendung einen Ereignisfilter installieren:

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) 

Aber beachten Sie, dass dies wirklich alles tut bekommen, so dass Sie mit am Ende mehr, als Sie erwartet hatten ...

+0

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? –

+0

@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

Verwandte Themen