PyQt и контекстное меню - PullRequest
       16

PyQt и контекстное меню

14 голосов
/ 23 апреля 2009

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

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

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

Ответы [ 2 ]

40 голосов
/ 23 апреля 2009

Я не могу говорить за Python, но это довольно легко в 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.

РЕДАКТИРОВАТЬ: после просмотра в Google, вот часть настройки моего примера на python:

self.w = QWhatever();
self.w.setContextMenuPolicy(Qt.CustomContextMenu)
self.connect(self.w,SIGNAL('customContextMenuRequested(QPoint)'), self.ctxMenu)
14 голосов
/ 06 июня 2009

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

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) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...