如何添加 qtreeview 子项

How do I add qtreeview sub items

如何在下面提供的代码中将 children 添加到我当前的 qtreeview 项目?我希望它看起来像这样:

下面的代码创建了一个排序的树视图,但我并不完全清楚如何添加 children 项。希望大家帮忙,谢谢

import sys
from PySide import QtGui, QtCore

class SortModel(QtGui.QSortFilterProxyModel):

    def __init__(self, *args, **kwargs):
        super(SortModel, self).__init__(*args, **kwargs)

    def lessThan(self, left, right):
        leftData = self.sourceModel().data(left)
        rightData = self.sourceModel().data(right)

        if leftData:
            leftData = leftData.lower()
        if rightData:
            rightData = rightData.lower()

        print('L:', leftData, 'R:', rightData)
        return leftData < rightData


class Browser(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Browser, self).__init__(parent)

        self.initUI()

    def initUI(self):
        self.resize(200, 300)
        self.setWindowTitle('Assets')
        self.setModal(True)

        self.results = ""

        self.uiItems = QtGui.QTreeView()
        self.uiItems.setAlternatingRowColors(True)
        self.uiItems.setSortingEnabled(True)
        self.uiItems.sortByColumn(0, QtCore.Qt.AscendingOrder)
        self.uiItems.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.uiItems.header().setResizeMode(QtGui.QHeaderView.ResizeToContents)
        self._model = self.create_model(self)
        self._spmodel = SortModel(self)
        self._spmodel.setSourceModel(self._model)
        self._spmodel.setDynamicSortFilter(True)
        self.uiItems.setModel(self._spmodel)

        grid = QtGui.QGridLayout()
        grid.setContentsMargins(0, 0, 0, 0)
        grid.addWidget(self.uiItems, 0, 0)
        self.setLayout(grid)

        self.setLayout(grid)

        self.uiItems.doubleClicked.connect(self.doubleClickedItem)
        self.show()

    def doubleClickedItem(self, item):
        name = item.data(role=QtCore.Qt.DisplayRole)
        print name

    def create_model(self, parent):

        items = [
            'Cookie dough',
            'Hummus',
            'Spaghetti',
            'Dal makhani',
            'Chocolate whipped cream'
        ]

        model = QtGui.QStandardItemModel()
        model.setHorizontalHeaderLabels(['Name'])

        for item in items:
            model.appendRow(QtGui.QStandardItem(item))


        return model

    def showEvent(self, event):
        geom = self.frameGeometry()
        geom.moveCenter(QtGui.QCursor.pos())
        self.setGeometry(geom)
        super(Browser, self).showEvent(event)

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            # self.hide()
            self.close()
            event.accept()
        else:
            super(Browser, self).keyPressEvent(event)


def main():
    app = QtGui.QApplication(sys.argv)
    ex = Browser()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

您可以在 create_model 方法中执行此操作。有几种不同的方法可以附加 child 行和列。不要将 QStandardItem 直接传递给 model.appendRow,而是创建它并将其保存在变量中。然后您可以使用 QStandardItem.appendRow 将 children 添加到您的顶级行。

我不知道 Python 可能语法有误,但基本模式是这样的:

std_item = QtGui.QStandardItem ("Dinner")
child_std_item = QtGui.QStandardItem ("Drinks")
std_item.appendRow (child_std_item)

或者,您可以使用 model.insertRow 在模型级别执行此操作并指定 parent 项的 QModelIndex。您可以使用 model.indexFromItem 获取项目的 QModelIndex。希望这足以让你继续前进。每个 QStandardItem 都知道它的 parent(如果有的话)和它的 children,所以这通常是让 parent 可用于 add/change/remove children 的问题。