2015-12-09 90 views
0


你好我正在使用python3.4,Windows 7中的PyQt5製作桌面GUI應用程序。我做了一個簡單的QTreeWidget。我添加了一個上下文菜單。如何在QTreeWidget的上下文菜單中發送信號?

我的參考代碼是這樣的(https://wiki.python.org/moin/PyQt/Creating%20a%20context%20menu%20for%20a%20tree%20view

參考代碼效果很好。當我點擊QTreeWidgetItem上的鼠標右鍵,彈出上下文菜單。

但我不知道如何發出一個信號,當用戶點擊上下文菜單。

我該怎麼辦?

+0

你的意思是當你發出一個信號,當你點擊上下文菜單的一個動作? – Mel

+0

是的! 'tmoreau'。這就是我想要的! – passion053

+0

看看[QMenu文檔](http://doc.qt.io/qt-4.8/qmenu.html#details),已經有信號了。 – Mel

回答

1

使用相同的示例並添加了事件的QAction。正如tmoreau說你需要閱讀文檔非常好:)

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from functools import partial 

data = [ 
    ("Alice", [ 
     ("Keys", []), 
     ("Purse", [ 
      ("Cellphone", []) 
      ]) 
     ]), 
    ("Bob", [ 
     ("Wallet", [ 
      ("Credit card", []), 
      ("Money", []) 
      ]) 
     ]) 
    ] 

class Window(QWidget): 

    def __init__(self): 

     QWidget.__init__(self) 

     self.treeView = QTreeView() 
     self.treeView.setContextMenuPolicy(Qt.CustomContextMenu) 
     self.treeView.customContextMenuRequested.connect(self.openMenu) 

     self.model = QStandardItemModel() 
     self.addItems(self.model, data) 
     self.treeView.setModel(self.model) 

     self.model.setHorizontalHeaderLabels([self.tr("Object")]) 

     layout = QVBoxLayout() 
     layout.addWidget(self.treeView) 
     self.setLayout(layout) 

    def addItems(self, parent, elements): 

     for text, children in elements: 
      item = QStandardItem(text) 
      parent.appendRow(item) 
      if children: 
       self.addItems(item, children) 

    def openMenu(self, position): 

     indexes = self.treeView.selectedIndexes() 
     if len(indexes) > 0: 

      level = 0 
      index = indexes[0] 
      while index.parent().isValid(): 
       index = index.parent() 
       level += 1 

     menu = QMenu() 
     editMenu = None 
     if level == 0: 
      editMenu = QAction("Edit person", self) 
      menu.addAction(editMenu) 
     elif level == 1: 
      editMenu = QAction("Edit object/container", self) 
      menu.addAction(editMenu) 
     elif level == 2: 
      editMenu = QAction("Edit object", self) 
      menu.addAction(editMenu) 

     if editMenu: 
      editMenu.triggered.connect(partial(self.editObjFunc, level)) 

     menu.exec_(self.treeView.viewport().mapToGlobal(position)) 

    def editObjFunc(self, level): 
     print level 


if __name__ == "__main__": 

    app = QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

謝謝你,'Achayan'!你節省了我的時間!我將嘗試瞭解qt文檔。 – passion053

相關問題