更改 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)
我正在尝试为项目的一部分创建一个虚拟文件系统(因为我找不到任何用于此的库——我找到的所有库都是用于访问您的实际文件系统)。
我决定将其存储为 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)