python - 更改 QTreeView 中的某些数据

标签 python pyqt pyqt5 qtreeview

我正在尝试为项目的一部分创建一个虚拟文件系统(因为我找不到任何用于此的库 - 我找到的所有库都是用于访问您的实际文件系统)。
我决定将其存储为 XML,然后通过生成 QStandardItemModel 并基于该模型生成 QTreeView 来显示它。
我目前正在尝试添加重命名、移动等选项。我可以很容易地在 XML 中执行这些更改,但我已经花了几个小时试图用树 View 弄明白,但没有得到任何结果。我能做的最好的事情是从 xml 文件重新生成模型,然后将其设为树 View 模型。但是,这对于我的最终程序(将有几千个"file")来说可能太慢了,并且这也会折叠树 View 中的所有节点,这似乎很烦人。总的来说,这似乎不是最好的方法,尤其是因为我知道哪些节点正在被更改,所以在树 View (或模型)中编辑这些单个节点会简单得多。
我希望它工作的方式是,用户选择树 View 的一个元素进行重命名,我从树 View 中获取 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_()

最佳答案

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)

关于python - 更改 QTreeView 中的某些数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62598469/

相关文章:

python - 检查系统是否存在字体 python (与操作系统无关)

python - ChronoFresh SOAP 授权

python - 子图和颜色的不同变量的 Pandas 图?

python - PyQt:加载 "heavy"库时启动屏幕

python - 'helloworld.pyx' 不匹配任何文件

python - 如何让 PyQT 程序不断刷新一个小部件,始终提供最新值?

python - 尝试优化 pyqtgraph 绘图

python - 使用简单的 PyQT UI 选择目录路径粉碎

python - QtWidgets.QApplication(sys.argv) 后无法导入 PyQt 模块

python - QGridLayout 小部件重叠