更改 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 中的某些行

如何隐藏 QTreeView 中的某些列? [复制]

QTreeView:如何中止选择更改

改变QTreeView项高的方法(改变Delegate行高,或者::data取数据的时候,根据Qt::SizeHintRole进行判断)

QTableWidget 作为 QTreeView 中的子级

如何配置 QTreeView 以在使用箭头键移动时保留多项选择