2010-08-21 11 views
2

J'ai un widget (QTabeleWidget, QLabels et quelques QButtons). Il a été construit dans Qt-Designer. Et maintenant je dois mettre en place certaines choses. Pour cela j'ai besoin du mousePressEvent. En général, j'écrirait une sous-classe et d'écrire quelque chose comme ceci:Comment implémenter MousePressEvent pour un widget Qt-Designer dans PyQt

def mousePressEvent(self, event): 
    if event.button() == Qt.LeftButton: 
     print "left" 
    else: 
     print 'right' 

Mais je ne sais pas comment faire pour un widget créé dans le concepteur. J'en ai besoin pour le QTabeleWidget. J'espère que quelqu'un peut m'aider. J'ai essayé de résoudre le problème avec l'aide de google, mais sans succès. Ce site m'a aidé plusieurs fois, alors j'ai pensé que je vais essayer.

Répondre

3

Avec PyQt, il y a trois façons de travailler avec des formulaires créés dans le concepteur:

  1. à usage unique héritage et faire la forme d'une variable membre
  2. Utilisation de l'héritage multiple
  3. générer dynamiquement les membres directement à partir le fichier de l'interface utilisateur

héritage unique:

class MyTableWidget(QTableWidget): 
    def __init__(self, parent, *args): 
     super(MyTableWidget, self).__init__(parent, args) 
     self.ui = YourFormName() 
     self.ui.setupUi(self) 
     # all gui elements are now accessed through self.ui 
    def mousePressEvent(self, event): 
     pass # do something useful 

héritage multiple:

class MyTableWidget(QTableWidget, YourFormName): 
    def __init__(self, parent, *args): 
     super(MyTableWidget, self).__init__(parent, args) 
     self.setupUi(self) 
     # self now has all members you defined in the form 
    def mousePressEvent(self, event): 
     pass # do something useful 

Dynamiquement Généré:

from PyQt4 import uic 
yourFormTypeInstance = uic.loadUi('/path/to/your/file.ui') 

Pour (3) ci-dessus, vous vous retrouverez avec une instance de quel type de base que vous avez spécifié pour votre forme. Vous pouvez ensuite remplacer votre mousePressEvent comme vous le souhaitez. Je recommande que vous jetez un oeil à section 13.1 dans le PyQt4 reference manual. La section 13.2 parle du module uic.

+0

Merci pour la réponse. J'ai essayé, mais ça ne marche pas. Si je clique sur la fenêtre, pas un widget, alors il se déclenche. Le mousePressEvent fonctionne. Mais si je clique sur le QTableWidget ou un QLabel, le mousePressEvent n'est pas exécuté. Par exemple, si je veux le signal itemSelectionChanged du QTableWidget, j'écris: "def on_myTable_itemSelectionChanged (self):" Donc je cherche quelque chose d'équivalent pour le mousePressEvent. Espérons que mon explication n'est pas mauvaise. – user427305

+0

Le câblage automatique existe pour les signaux mais pas pour les événements. Lorsque vous sous-classez et implémentez 'mousePressEvent', vous recevrez des événements pour les widgets donnés, mais uniquement pour les événements où l'enfant n'accepte pas l'événement. Puisque vous avez des widgets dans le widget, chacun d'entre eux reçoit et traite l'événement avant que le parent ne le voit. Une bonne façon de traiter cela quand aucun signal pertinent n'est présent est d'installer un filtre d'événement en utilisant 'installEventFilter'. –

+0

Merci! Cela fonctionne avec installEventFilter. C'est ce que je cherchais. – user427305