2010-02-03 19 views
4

Je crée une petite application PyQt et je suis coincée dans l'effet MouseOver. J'ai un QMainWindow qui a trois boutons nommés createProfileButton, downloadPackagesButton et installPackagesButton. Tous ceux-ci sont de type QPushButtonQPushButton FocusIn génère quel signal?

Maintenant, j'ai créé une étiquette qui tiendra le texte lorsque quelqu'un passe la souris sur l'un de ces boutons. J'ai vérifié la documentation et est venu à savoir qu'il peut être manipulé à l'aide sur-riding

  • focusInEvent (auto, QFocusEvent)
  • focusOutEvent (auto, QFocusEvent)

méthodes du bouton. Maintenant, cela signifie que je dois étendre QPushButton pour chacun des trois boutons et chacun d'eux a un objet pour une classe. J'ai essayé de chasser pour le signal qui est émis quand la souris est plané ou enlevé du bouton, mais en vain. Toute l'aide que j'ai eu sur le net consistait à implémenter ces deux méthodes.

Est-ce que l'extension d'une classe et la création de l'une d'entre elles sont excessives? Un signal serait net, malheureusement, je n'ai trouvé aucun signal.

Alors j'ai vérifié toute la hiérarchie de l'héritage et n'a trouvé aucune signal pour FocusIn et FocusOut

Répondre

4

Comme vous l'avez indiqué, aucun signal n'existe pour cette fonctionnalité. Vous avez deux options de base.

Option 1 - Sous-classe:

class FocusEmittingButton(QPushButton): 
    #... 
    def focusInEvent(self, event): 
     # emit your signal 

Vous pouvez ensuite vous connecter à ce signal dans votre code client. En outre, si nécessaire, vous pouvez utiliser la fonctionnalité Promote To du concepteur pour promouvoir chaque bouton au type FocusEmittingButton. Vous aurez seulement besoin de sous-classer une fois, puis assurez-vous que les différents boutons sont tous du même type.

Option 2 - Utilisation QApplication.focusChanged

Vous pouvez également tirer parti QApplication.focusChanged(oldQWidget, newQWidget). Ce faisant, vous n'aurez pas besoin de sous-classer et de remplacer les événements de focus. Au lieu de cela, vous vous connectez au signal QApplication.focusChanged, puis répondez dans un gestionnaire.

+0

Je voulais dire que c'est la seule façon d'ajouter des événements de mise au point. J'ai encore dit que je voulais utiliser des signaux et non des méthodes d'événements. Je ne veux pas sous-classer une classe pour chaque bouton. –

+0

Il n'y a pas de signal pour le focus comme vous l'avez dit vous-même, vous devez soit sous-classe QPushButton (une fois pas une pour chaque instance) pour envoyer un signal quand il obtient le focus, ou utilisez QApplication.focusChanged comme Kaleb dit. –

+0

@Manish - Je vois ce que vous obtenez. J'ai édité ma réponse pour clarifier comment vous classeriez sous-classe. Si l'option 2 n'est pas assez claire, faites le moi savoir. –

1

Il existe une autre façon de recevoir des signaux de mise au point dans un widget parent. Vous pouvez ajouter un filtre d'événement:

class MyParent(QWidget): 
    def __init__(self): 
     #... 
     self.mybutton.installEventFilter() 

    def eventFilter(self, obj, event): 
     if obj is self.mybutton and event.type() == QEvent.FocusOut: 
      #... 
     return QWidget.eventFilter(self, obj, event)