更改 QTreeView 中的某些数据

Change certain data in QTreeView

我正在尝试为项目的一部分创建一个虚拟文件系统(因为我找不到任何用于此的库——我找到的所有库都是用于访问您的实际文件系统)。

我决定将其存储为 XML,然后通过生成 QStandardItemModel 并基于该模型生成 QTreeView 来显示它。

我目前正在尝试添加重命名、移动等选项。我可以很容易地在 XML 中执行这些更改,但是我花了几个小时试图用树视图来弄清楚它,但没有任何进展。我能做的最好的事情是从 xml 文件重新生成模型,然后将其设为树视图模型。但是,这对于我的最终程序(将有几千个“文件”)来说可能太慢了,而且这还会折叠树视图中的所有节点,修复起来似乎很烦人。总的来说,这似乎不是最好的方法,特别是因为我知道正在更改哪些节点,所以在树视图(或模型)中编辑这些单独的节点会简单得多。

我希望它的工作方式是,用户选择要重命名的树视图元素,我从树视图中获取 selectedItem,然后以某种方式在模型中查找相应的项目并修改它。

我也考虑过遍历模型以找到我想要的项目 move/rename 然后在模型中执行此操作,但我找不到任何关于如何遍历模型的好文档(它似乎甚至没有 returns 节点子节点数的方法。

有没有“不错”的方法来做到这一点?

示例:

def clicked():
    index = list(treeView.selectedIndexes())[0]
    # TODO: change text of index to "changed text"


app = QApplication([])

window = QWidget()
layout = QVBoxLayout()

treeView = QTreeView()

model = QStandardItemModel()
model.invisibleRootItem().appendRow(QStandardItem('a'))
child_node = QStandardItem('b')
child_node.appendRow(QStandardItem('c'))
model.invisibleRootItem().appendRow(child_node)

treeView.setModel(model)
treeView.clicked.connect(clicked)

layout.addWidget(treeView)

window.setLayout(layout)

window.show()

app.exec_()

点击信号发送与点击项关联的 QModelIndex,因此无需使用 selectedIndexes()。

归根结底,逻辑是使用模型获取给定QModelIndex的项目,然后使用setText()方法,另一个更通用的选择是使用setData()方法:

def clicked(index):
    model = index.model()

    item = model.itemFromIndex(index)
    item.setText("changed text")

    # or
    # model.setData(index, "changed text", Qt.DisplayRole)