QTreeWidget和PyQt:保存和读取数据的方法

2 投票
2 回答
2701 浏览
提问于 2025-04-17 07:59

我正在做一个项目,里面有一个 QTreeWidget。这个控件会有父节点和子节点,还有兄弟节点。每个节点都会有一个独特的 ID,用整数表示,还有一个名字。

现在……我应该用什么方法把所有的节点保存到磁盘上,然后再读取回来呢???

我打算遍历这个树,把每个节点保存到一个sqlite数据库里。我已经可以按照树中的顺序做到这一点。但是…… QTreeWidget 和它相关的 QTreeWidgetItem 对象没有一个可以用来插入其他节点的独特索引。

当我重建这个树的时候,子节点必须和它们的父节点或祖先连接在一起(这些父节点在树中已经存在)。为此,我会记录已经添加到树中的父节点及其 ID,像是(父节点名字,parentID)这样的信息放在一个数组里。需要注意的是,parentID 和节点在 QTreeWidget/WidgetItem 中的位置没有关系。这个 ID 是我自己创建的,并和节点的名字一起存储在sqlite数据库中,算是一种标签,因为 QTreeWidget/QTreeWidgetItem 并没有提供这样的标识。

为了找到正确的父节点,我会:

  1. 从sqlite数据库中获取 ParentID
  2. 在数组或 QTreeWidget 中查找这个 ID
  3. QTreeWidget 中选择这个父节点,
  4. 把sqlite数据库中的项作为子节点添加到这个父节点下。

但是这样做感觉有点笨拙,因为每次添加节点都要搜索,而且因为 QTreeWidget/WidgetItem 中缺少可以用来插入节点的索引。

我知道应该有更优雅、更少资源消耗的方法来做到这一点。我并不是在寻找具体的代码示例,而是想要一些关于如何使用 QTreeWidgetQTreeWidgetItem 的方法和属性的想法和提示。

有什么建议吗?

2 个回答

-1

把你的树形控件保存成XML格式是不是更自然一些呢?

如果是这样的话,QXmlStream书签示例可能会给你一些灵感。

0

我通过使用TreewidgetItem的data属性来解决这个问题,给它设置了一个值。然后用这个值作为参考,可以很方便地找到一个、多个甚至所有的TreewidgetItem,这样就能轻松保存整个树形结构。

撰写回答