1

我正在尝试从树视图中获取字符串/对象。因此,当用户单击树视图中的任何项目时,我可以在终端上显示它。任何帮助表示赞赏。这是代码。当我单击树视图中的字符串/项目时,它会显示: PyQt4.QtCore.QModelIndex object at 0xb6b6c7d4 而不是 Linux

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtCore, QtGui

data = root = [

    ("Linux", [

        ("System",

                [("System name",[]),
         ("Kernel", []),
         ("Drivers", []),
         ("Memory", []),
         ("Processes", []),
                 ("Disk mounted", []), 
         ("Services Running", []),
         ("Installed Packages", [])]),
        #[("System name", [])]),

        ("Network",
        [("Nework confi.",[]),
        ("Interface test", [])]),

        ("PCI Devices",
        [("PCI devices", [])]),

        ("Logs", 
        [("Messages",[]),
        ("Dmesg", [])]),


        ])]

class Window(QWidget):

    def __init__(self):

        QWidget.__init__(self)

        self.treeView = QTreeView()


        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)
    self.treeView.connect(self.treeView, QtCore.SIGNAL('clicked(QModelIndex)'), self.treefunction)

    def treefunction(self, index):
    print index


    def addItems(self, parent, elements):

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

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

1 回答 1

5

轻松修复。您的信号返回一个 QModelIndex,但您需要使用itemFromIndex在模型中查找该索引的项目:

def treefunction(self, index):
    print index.model().itemFromIndex(index).text()
    # print self.model.itemFromIndex(index).text()

您可以从索引中获取模型,或者专门使用您的模型属性。

虽然我在讲台上,但我想提一下连接信号和插槽的非常棒的新型方法,只要您使用的是 Qt 4.5+

self.treeView.clicked.connect(self.treefunction)

请注意您不必再指定基于字符串的签名。它完全是对象样式,您可以直接访问信号对象并告诉它要连接的可调用插槽。

于 2012-07-16T00:44:44.717 回答