2017-10-03 3 views
1

J'ai ce code simple, lorsque la touche ESC enfoncée PRINTS, mais il semble exécuter "double" fois au lieu de tirer une seule fois. Python 3.6.2 x86 + PyQt 5,9Python PyQt5 - QEvent Keypress exécute deux fois

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 
import sys 

from PyQt5.QtWidgets import * 
from PyQt5.QtCore import Qt 
from PyQt5 import QtCore, QtGui, QtWidgets 


class MainWindow(QtWidgets.QWidget): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     qApp.installEventFilter(self) #keyboard control 

    def eventFilter(self, obj, event): 
     if (event.type() == QtCore.QEvent.KeyPress): 
      key = event.key() 

      if key == Qt.Key_Escape: 
       print("Escape key") 

     return super(MainWindow, self).eventFilter(obj, event) 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 

Répondre

2

An-filtre d'événement installé sur le QApplication recevra des événements pour tous les objets dans l'application. Vous devez donc vérifier l'argument obj pour filtrer les événements des objets qui ne vous intéressent pas.

Dans votre exemple, vous ne souhaitez probablement que des événements dans votre fenêtre principale. Donc, vous pouvez le réparer comme ceci:

def eventFilter(self, obj, event): 
    if (event.type() == QtCore.QEvent.KeyPress and obj is self): 
     ... 
+0

Salut ekhumoro, "et obj est soi" n'a pas aidé. Cependant en ajoutant: "return 1" Semble fonctionner :) – Kiril

+0

@Kiril. Cela fonctionne bien pour moi sur Linux. Peut-être que cela fonctionne différemment sur d'autres plateformes. Le problème avec le retour de '1' (ou' True') est qu'il va "manger" l'événement, et tout comportement par défaut sera beaucoup. Mais peut-être que ce n'est pas un problème dans votre application. – ekhumoro

+1

@Kiril. Juste un intérêt, pouvez-vous montrer la sortie de 'print (" touche d'échappement ", obj)' en utilisant votre exemple original. Je voudrais essayer de corriger ma réponse afin qu'elle fonctionne sur toutes les plateformes. – ekhumoro