2010-08-27 28 views
1

Je ne comprends pas pourquoi dans le livre GUI rapide programmation avec Python et Qt, un menu contextuel est ajouté à un widget central en appelant addActions()dans la fenêtre principale (self), comme si (p 180.):Qt: le meilleur moyen d'ajouter un menu contextuel au widget central?

self.addActions(self.imageLabel, 
       (editInvertAction, …)) 

self est un QMainWindow et imageLabel est un ensemble QLabel comme le widget central avec

self.imageLabel.setContextMenuPolicy(Qt.ActionsContextMenu) # Added actions will be put in a context menu 
self.setCentralWidget(self.imageLabel) 

maintenant, pourquoi la fenêtre principale serait-elle associée d'une certaine façon (par l'intermédiaire de self.addActions()) au menu contextuel du widget central? N'est-ce pas suffisant d'appeler addActions() directement sur le widget central? En fait, ce qui suit crée un menu contextuel:

self.imageLabel.addActions((editInvertAction, …)) 

Pourquoi le livre n'indique-t-il pas le menu contextuel de cette façon? n'est-ce pas l'équivalent du formulaire self.addActions(…) plus impliqué?

PS: Je vois même que le documentation for QMainWindow.addActions() ne mentionne même pas le premier argument (self.imageLabel, au-dessus)! Je suis complètement perdu quant à la raison pour laquelle le livre utilise le premier extrait ci-dessus au lieu du dernier ... Aide! :)

Répondre

1

L'utilisation de self.addAction() sur QMainWindow permet à tous les enfants QMainWindow (Docks, StatusBar, ToolBar, MenuBar, ...) d'utiliser ces actions, et pas seulement le widget central. Mais le meilleur moyen d'obtenir un contrôle de menu contextuel précis est d'utiliser le signal customContextMenuRequested (http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qwidget.html#customContextMenuRequested).

+0

Merci! Les actions passées au widget central sont déjà utilisées par les enfants de QMainWindow (menu, etc.), et je ne vois pas le menu contextuel ailleurs qu'en dehors du widget central. Donc, je ne suis pas sûr de comprendre votre réponse ... :) – EOL

+0

Hum, désolé, je n'ai pas vu le "self.imageLabel", à l'intérieur du premier self.addActions. Peut-être que le livre est juste faux. (Quelque chose comme QWidget.addAction (self.imageLabel, (editInvertAction, ...)) fonctionnerait probablement, mais c'est moche). Utilisez self.imageLabel.addActions ou, mieux, le signal customContextMenuRequested. – iksaif

+0

Le code du livre semble faire ce qui est prévu, cependant. Merci pour votre contribution utile! – EOL