更改 QTreeView 中的某些数据
Posted
技术标签:
【中文标题】更改 QTreeView 中的某些数据【英文标题】:Change certain data in QTreeView 【发布时间】:2020-10-17 06:36:40 【问题描述】:我正在尝试为项目的一部分创建一个虚拟文件系统(因为我找不到任何用于此的库 - 我找到的所有库都用于访问您的实际文件系统)。
我决定将其存储为 XML,然后通过生成 QStandardItemModel 并基于该模型生成 QTreeView 来显示它。
我目前正在尝试添加重命名、移动等选项。我可以相当容易地在 XML 中执行这些更改,但是我花了几个小时试图用树视图弄清楚它,但还没有得到任何结果。我能做的最好的事情是从 xml 文件重新生成模型,然后制作树视图模型。但是,这对于我的最终程序(将有几千个“文件”)来说可能太慢了,而且这也会折叠树视图中的所有节点,这看起来很烦人。总的来说,这似乎不是最好的方法,特别是因为我知道哪些节点正在被更改,所以在树视图(或模型)中编辑这些单独的节点会简单得多。
我希望它工作的方式是,用户选择要重命名的树视图的元素,我从树视图中获取 selectedItem,然后以某种方式在模型中查找相应的项目并对其进行修改。
我也考虑过遍历模型以找到我想要移动/重命名的项目,然后在模型中执行此操作,但我找不到任何关于如何遍历模型的好的文档(它甚至没有似乎有一个方法可以返回节点的子节点数)。
有没有“好”的方法?
例子:
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_()
【问题讨论】:
添加示例,对此感到抱歉。 【参考方案1】:clicked 信号发送与被点击项目关联的 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)
【讨论】:
非常感谢,这么简单的解决方案!感谢您澄清点击的信号参数。 对了,文本和数据有什么区别? @PrimeNumbers QStandardItem 是一个 QModelIndex 包装器,允许您轻松修改角色,例如 setText() 方法使用 setData() 方法。 setData() 方法拥有所有可编辑模型,但 setText() 方法只有 QStandardItem以上是关于更改 QTreeView 中的某些数据的主要内容,如果未能解决你的问题,请参考以下文章
改变QTreeView项高的方法(改变Delegate行高,或者::data取数据的时候,根据Qt::SizeHintRole进行判断)