2016-10-01 6 views
1

Je souhaite gérer les événements clés des touches fléchées dans mon application. J'ai déjà lu que pour ce faire, l'accent doit être désactivé. Je suis cette méthode: PyQt not recognizing arrow keys. En effet, lorsque j'appelle self.setChildrenFocusPolicy(QtCore.Qt.NoFocus) (comme défini dans le thread lié et dans mon code source ci-dessous) au sein de MyApp.__init__, appuyer sur une touche fléchée déclenche un événement clé. Cependant, je ne veux pas que le focus reste désactivé pendant tout le temps d'exécution de l'application, mais seulement en cliquant sur un bouton. Je propose donc self.setChildrenFocusPolicy(QtCore.Qt.NoFocus) au bouton clic fonction:Gestion des événements de flèches en définissant la politique de mise au point

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

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

En effet, appuyer sur le bouton-poussoir désactive la mise au point (par exemple une modification de ligne ne peut pas prendre le curseur de texte plus). Cependant, appuyer sur une touche fléchée ne déclenche toujours pas d'événement clé.

L'ensemble de l'application (vous aurez besoin d'un mainwindow.ui avec un bouton-poussoir):

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

Répondre

1

Il n'y a pas besoin de désactiver le focus. Vous pouvez avoir accès à tous les événements clés en installant un filtre d'événement sur l'application:

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) 

Mais notez que cela n'a vraiment tout, donc vous pouvez vous retrouver avec plus que vous espériez ...

+0

Cela fonctionne. Avez-vous une idée de la raison pour laquelle la méthode mentionnée dans l'autre thread ne fonctionne que dans la fonction '__init__', mais pas plus tard? –

+0

@MichaelWestwort. Pas vraiment, et je ne me sens pas bien motivé à parcourir tout le code dans cette réponse pour comprendre ce qu'il essaie de faire ;-) Pourquoi avez-vous besoin de savoir? – ekhumoro