2009-04-23 40 views
14

Necesito crear un menú contextual al hacer clic derecho en mi ventana. Pero realmente no sé cómo lograr eso.PyQt y menú contextual

¿Hay algún widgets para eso, o tengo que crearlo desde el principio?

Lenguaje de programación: Python
lib gráfica: Qt (PyQt)

Respuesta

40

No puedo hablar en nombre de pitón, pero es bastante fácil en C++.

primera después de crear el widget que establece la directiva:

w->setContextMenuPolicy(Qt::CustomContextMenu); 

continuación, se conecta el evento menú contextual para un slot:

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

Por último, se implementa la ranura:

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

así es como lo haces en C++, no debería ser demasiado diferente en la API de python.

EDIT: después de mirar en google, aquí está la parte de configuración de mi ejemplo en Python:

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

nota de que en el PyQt4, CustomContextMenu ubicación en el paquete está aquí: PyQt4.QtCore.Qt.CustomContextMenu –

+2

Me encanta que la downvote azar después de dos años y 19 upvotes :-P –

+0

El downvote fue accidental y estoy Realmente lo siento mucho. La respuesta realmente me ayudó mucho. –

14

Otro ejemplo que muestra cómo utilizar las acciones en un menú de la barra de herramientas y el contexto.

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

Gracias @PedroMorgan por esto - Encontré un código en línea usando "_SIGNAL (" customContextMenuRequest ... _ ", y me preguntaba por qué no funciona':) '- gracias a esta publicación, sé que ahora se llama' customContextMenuRequested', con "ed" al final ... ¡Salud! – sdaau

+0

Sé que esta es una publicación anterior, pero el ejemplo dado por PedroMorgan no funciona para mí. He realizado muchas búsquedas en Google y esta es la más cercana que tengo. conseguido. lo único que consigue al hacer clic derecho en la lista es una pequeña caja de un píxel de tamaño cuando hago clic derecho. Puede alguien que me señale un ejemplo más reciente de la utilización de los menús de contexto en PyQt que se demuestra tan simple como esto uno por Pedro. – PrestonDocks

+0

@PrestonDocks - tengo un ejemplo fijo ... espero que funcione ... por ahora ... – PedroMorgan

Cuestiones relacionadas