PyQt e menu di scelta rapida
Domanda
Ho bisogno di creare un menu contestuale sul tasto destro del mouse alla mia finestra. Ma io davvero non so come raggiungere questo obiettivo.
Ci sono tutti i widget per questo, o devo creare fin dall'inizio?
Linguaggio di programmazione: Python
lib grafica: Qt (PyQt)
Soluzione
Non posso parlare per Python, ma è abbastanza facile in C ++.
prima dopo aver creato il widget si imposta il criterio:
w->setContextMenuPolicy(Qt::CustomContextMenu);
allora si collega l'evento menu contestuale per uno slot:
connect(w, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ctxMenu(const QPoint &)));
Infine, si implementa lo slot:
void A::ctxMenu(const QPoint &pos) {
QMenu *menu = new QMenu;
menu->addAction(tr("Test Item"), this, SLOT(test_slot()));
menu->exec(w->mapToGlobal(pos));
}
è così che si fa in C ++, non dovrebbe essere troppo diverso nelle API python.
Modifica dopo aver cercato su google, ecco la parte di installazione del mio esempio in python:
self.w = QWhatever();
self.w.setContextMenuPolicy(Qt.CustomContextMenu)
self.connect(self.w,SIGNAL('customContextMenuRequested(QPoint)'), self.ctxMenu)
Altri suggerimenti
Un altro esempio che dimostra come utilizzare le azioni in un menu della barra degli strumenti e il contesto.
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) )