2009-04-23 3 views
14

Мне нужно создать контекстное меню, щелкнув правой кнопкой мыши в моем окне. Но я действительно не знаю, как этого добиться.PyQt и контекстное меню

Есть ли какие-либо виджеты для этого, или я должен создать его с самого начала?

Язык программирования: Python
Графического Lib: Qt (PyQt)

ответ

40

Я не могу говорить за питон, но это довольно легко в C++.

первый после создания виджета вы можете настроить политику:

w->setContextMenuPolicy(Qt::CustomContextMenu); 

затем при подключении события контекстного меню к слоту:

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

Наконец, вы реализуете слот:

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++, не должно быть слишком различным в API-интерфейсе python.

EDIT: осмотрев на Google, вот часть установки моего, например, в Python:

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

отмечает, что в PyQt4, CustomContextMenu место в пакете находится здесь: PyQt4.QtCore.Qt.CustomContextMenu –

+2

Должны любить случайный downvote после двух лет и 19 upvotes :-P –

+0

downvote был случайным, и я Мне очень жаль. Ответ мне очень помог. –

14

Другой пример, который показывает, как использовать действия в меню панели инструментов и контекста.

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

Спасибо @PedroMorgan за это - я нашел код в Интернете, используя «_SIGNAL (« customContextMenuRequest ... _ », и задавался вопросом, почему он не работает':) '- благодаря этому сообщению я знаю, что теперь он называется' customContextMenuRequested', с «ed» в конце ... Cheers! – sdaau

+0

Я знаю, что это старый пост, но пример, данный PedroMorgan, не работает для меня. Я сделал так много поисков в google, и это самое близкое мне Все, что я получаю, когда я нажимаю правой кнопкой мыши по списку, - это маленькая коробка размером в один пиксель, когда я нажимаю правой кнопкой мыши. Может ли кто-нибудь указать мне на более свежий пример использования контекстных меню в PyQt, который демонстрируется так же просто, как это один из Педро. – PrestonDocks

+0

@ PrestonDocks - исправить пример .. надеюсь, что он работает .. к настоящему времени. – PedroMorgan

Смежные вопросы