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_())
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? –
@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