2009-04-23 12 views
14

Je dois créer un menu contextuel en cliquant avec le bouton droit sur ma fenêtre. Mais je ne sais vraiment pas comment y parvenir.PyQt et le menu contextuel

Y at-il des widgets pour cela, ou je dois le créer depuis le début?

Langage de programmation: Python
lib graphique: Qt (PyQt)

Répondre

40

Je ne peux pas parler pour python, mais il est assez facile en C++.

premier après avoir créé le widget que vous définissez la stratégie:

w->setContextMenuPolicy(Qt::CustomContextMenu); 

vous connecter à un emplacement de l'événement menu contextuel:

connect(w, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &))); 

Enfin, vous implémentez la fente:

void A::ctxMenu(const QPoint &pos) { 
    QMenu *menu = new QMenu; 
    menu->addAction(tr("Test Item"), this, SLOT(test_slot())); 
    menu->exec(w->mapToGlobal(pos)); 
} 

c'est comme ça que vous le faites en C++, ne devrait pas être trop différent dans l'API python.

EDIT: après avoir regardé autour sur Google, voici la partie de configuration de mon exemple en python:

self.w = QWhatever(); 
self.w.setContextMenuPolicy(Qt.CustomContextMenu) 
self.connect(self.w,SIGNAL('customContextMenuRequested(QPoint)'), self.ctxMenu) 
+1

noter que dans le PyQt4, l'emplacement CustomContextMenu dans le paquet est ici: PyQt4.QtCore.Qt.CustomContextMenu –

+2

Gotta love le downvote au hasard après deux ans et 19 upvotes :-P –

+0

Le downvote était accidentelle et je Je suis vraiment vraiment désolé. La réponse m'a vraiment beaucoup aidé. –

14

Un autre exemple qui montre comment utiliser les actions dans une barre d'outils et le menu contextuel.

class Foo(QtGui.QWidget): 

    def __init__(self): 
     QtGui.QWidget.__init__(self, None) 
     mainLayout = QtGui.QVBoxLayout() 
     self.setLayout(mainLayout) 

     # Toolbar 
     toolbar = QtGui.QToolBar() 
     mainLayout.addWidget(toolbar) 

     # Action are added/created using the toolbar.addAction 
     # which creates a QAction, and returns a pointer.. 
     # .. instead of myAct = new QAction().. toolbar.AddAction(myAct) 
     # see also menu.addAction and others 
     self.actionAdd = toolbar.addAction("New", self.on_action_add) 
     self.actionEdit = toolbar.addAction("Edit", self.on_action_edit) 
     self.actionDelete = toolbar.addAction("Delete", self.on_action_delete) 
     self.actionDelete.setDisabled(True) 

     # Tree 
     self.tree = QtGui.QTreeView() 
     mainLayout.addWidget(self.tree) 
     self.tree.setContextMenuPolicy(Qt.CustomContextMenu) 
     self.connect(self.tree, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu) 

     # Popup Menu is not visible, but we add actions from above 
     self.popMenu = QtGui.QMenu(self) 
     self.popMenu.addAction(self.actionEdit) 
     self.popMenu.addAction(self.actionDelete) 
     self.popMenu.addSeparator() 
     self.popMenu.addAction(self.actionAdd) 

    def on_context_menu(self, point): 

     self.popMenu.exec_(self.tree.mapToGlobal(point)) 
+0

Merci @PedroMorgan pour cela - J'ai trouvé du code en ligne en utilisant "_SIGNAL (" customContextMenuRequest ... _ ", et je me demandais pourquoi cela ne fonctionne pas':) '- grâce à ce post, je sais maintenant qu'il s'appelle' customContextMenuRequested', avec "ed" à la fin ... Cheers! – sdaau

+0

Je sais que c'est un vieux post, mais l'exemple donné par PedroMorgan ne fonctionne pas pour moi.J'ai fait tant de recherches sur google et c'est le plus proche que j'ai Tout ce que je reçois quand je clique avec le bouton droit de la souris sur la liste, c'est une petite case d'un pixel lorsque je clique avec le bouton droit Quelqu'un peut-il me montrer un exemple plus récent d'utilisation de menus contextuels dans PyQt qui est démontré simplement? un par Pedro – PrestonDocks

+0

@PrestonDocks - ont fixé l'exemple .. espérons que cela fonctionne .. maintenant .. – PedroMorgan