2009-04-23 46 views
14

Tôi cần tạo menu ngữ cảnh khi nhấp chuột phải vào cửa sổ của tôi. Nhưng tôi thực sự không biết làm thế nào để đạt được điều đó.PyQt và menu ngữ cảnh

Có tiện ích nào cho điều đó hay tôi phải tạo nó ngay từ đầu?

Lập trình ngôn ngữ: Python
đồ họa lib: Qt (PyQt)

Trả lời

40

tôi không thể nói cho trăn, nhưng nó khá dễ dàng trong C++.

đầu tiên sau khi tạo widget bạn thiết lập chính sách:

w->setContextMenuPolicy(Qt::CustomContextMenu); 

sau đó bạn kết nối các sự kiện menu ngữ cảnh để một khe cắm:

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

Cuối cùng, bạn thực hiện các khe:

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

đó là cách bạn làm điều đó trong C++, không nên quá khác biệt trong API python.

EDIT: sau khi nhìn xung quanh trên google, đây là phần thiết lập của ví dụ của tôi trong python:

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

lưu ý rằng trong PyQt4, CustomContextMenu vị trí trong gói là ở đây: PyQt4.QtCore.Qt.CustomContextMenu –

+2

Gotta love downvote ngẫu nhiên sau hai năm và 19 upvotes :-P –

+0

Các downvote là tình cờ và tôi m thực sự thực sự xin lỗi. Câu trả lời thực sự đã giúp tôi rất nhiều. –

14

Một ví dụ khác trong đó cho thấy làm thế nào để sử dụng hành động trong một thanh công cụ và menu ngữ cảnh.

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

Cảm ơn @PedroMorgan vì điều này - Tôi tìm thấy một số mã trực tuyến bằng cách sử dụng "_SIGNAL (" customContextMenuRequest ... _ ", và đã tự hỏi tại sao nó không hoạt động':) '- nhờ bài này, tôi biết bây giờ nó được gọi là' customContextMenuRequested', với "ed" ở cuối ... Chúc mừng! – sdaau

+0

Tôi biết đây là một bài đăng cũ, nhưng ví dụ được đưa ra bởi PedroMorgan không làm việc cho tôi. Tôi đã thực hiện rất nhiều tìm kiếm trên google và đây là gần nhất tôi có Tất cả những gì tôi nhận được khi tôi Nhấp chuột phải vào danh sách là một hộp nhỏ có kích thước một pixel khi tôi nhấp chuột phải. Bất cứ ai có thể chỉ cho tôi một ví dụ gần đây hơn về cách sử dụng menu ngữ cảnh trong PyQt. một bởi Pedro – PrestonDocks

+0

@PrestonDocks - có ví dụ cố định .. hy vọng nó hoạt động .. bởi bây giờ .. – PedroMorgan

Các vấn đề liên quan