2009-04-23 13 views
14

Potrzebuję utworzyć menu kontekstowe po kliknięciu prawym przyciskiem myszy w moim oknie. Ale naprawdę nie wiem, jak to osiągnąć.PyQt i menu kontekstowe

Czy są na to jakieś widżety, czy muszę je utworzyć od początku?

język programowania: Python
Graphical lib: Qt (PyQt)

Odpowiedz

40

Nie mogę mówić za pytona, ale to jest dość łatwe w C++.

pierwszy po utworzeniu widget ustawisz zasadę:

w->setContextMenuPolicy(Qt::CustomContextMenu); 

następnie zdarzenie menu kontekstowego podłączeniu do gniazda:

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

Wreszcie, można zaimplementować gniazd:

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

to, jak to zrobić w języku C++, nie powinno być zbyt różne w interfejsie Pythona API.

EDIT: po rozglądając się na google, oto część konfiguracji mojego przykład w Pythonie:

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

Zauważ, że w PyQt4, CustomContextMenu lokalizacja w opakowaniu jest tutaj: PyQt4.QtCore.Qt.CustomContextMenu –

+2

Pokochałbyś losowych downvote po dwóch latach i 19 upvotes :-P –

+0

downvote było przypadkowe i ja” naprawdę mi przykro. Odpowiedź rzeczywiście bardzo mi pomogła. –

14

Innym przykładem, który pokazuje, jak używać działania w menu paska narzędzi i kontekstowego.

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

Dzięki @PedroMorgan do tego - znalazłem kod online za pomocą "_SIGNAL (" customContextMenuRequest ... _ ", i zastanawiałem się, dlaczego to nie działa':) '- dzięki temu wpisowi, wiem, że teraz nazywa się' customContextMenuRequested', z "ed" na końcu ... Pozdrawiam! – sdaau

+0

Wiem, że to stary post, ale przykład podany przez PedroMorgan nie działa dla mnie. Zrobiłem tak wiele wyszukiwań w Google i jest to najbliżej mam otrzymałem Wszystko, co otrzymuję, gdy kliknę prawym przyciskiem myszy, to małe okienko o wielkości jednego piksela po kliknięciu prawym przyciskiem myszy: Czy ktoś może wskazać mi bardziej aktualny przykład użycia menu kontekstowych w PyQt, który jest tak prosty, jak ten jeden przez Pedro. – PrestonDocks

+0

@PrestonDocks - mam stały przykład .. mam nadzieję, że działa .. już teraz. – PedroMorgan

Powiązane problemy