Pyside的树模型

时间:2016-10-04 17:02:51

标签: qt treeview pyside model-view

也许我只是想到这一切都错了,但我觉得奇怪的是在Qt中有一个工作树模型,需要将数据包装在一个项目类中。

在我能够找到的所有示例中,为QTreeView制作的每个模型都需要实现自定义Node或TreeItem类(通常是类型(对象))。出于多种原因,这让我感到奇怪:

a)该模型能够直接提取数据的重点是什么? Node或TreeItem类似乎是额外的包袱。

b)即使树视图需要特殊的项/节点类,为什么该类不是某种QObject?我见过的大多数Node实现都有一组get / set父/子方法和属性;但似乎使用QObject已经内置了所有,所以为什么不使用它呢?

我的直觉(可能是错误的)告诉我,如果我们发现我们需要额外的Node类来实现树模型,那是因为Qt框架设计中存在差距......或者是对它的误解

我隐约知道QStandardItem和QStandardItemModel,但发现自己问为什么他们是QtGui的一部分,而不是QtCore,正如其他模型& modelItems是。用QtGui对这些类进行分组就像是视图和视频。模特正在混合在一起。也就是说,我也不明白为什么这些都在QtGui中,因为它们不从任何QtGui类继承(它们来自QtCore类)。

如果有人可以证明这个设计的合理性,请解释我是如何误解它的,(或者只是与我的挫折感有关),我很乐意听到它!

谢谢!

1 个答案:

答案 0 :(得分:0)

多年来已经实施了多个基于QAbstractItemModel的数据模型(几十年?),我理解你的挫败感,但是...

  

在Qt中有一个工作树模型,需要将数据包装在一个项目类中。

完全没有。简单地说,在很多情况下,将模型行封装在自己的类中是有意义的 - 每列代表项的不同属性(例如,考虑如何实现QFileSystemModel)。 / p>

  

a)不是模型能够直接提取数据的全部意义吗? Node或TreeItem类似乎是额外的包袱。

可以使用QAbstractItemModel::dataQAbstractItemModel::setData

直接获取/设置数据
  

b)即使树视图需要特殊的项/节点类,为什么该类不是某种QObject?我见过的大多数Node实现都有一组get / set父/子方法和属性;但似乎使用QObject已经内置了所有,所以为什么不使用它呢?

QObject是一件相当重要的事情。鉴于模型可以有(数十?)数千行,每行可以有相当多的列,不难看出强制每个“单元”继承QObject可能无法很好地扩展。

  

我隐约知道QStandardItem和QStandardItemModel,但发现自己问为什么他们是QtGui的一部分,而不是QtCore,正如其他模型& modelItems是。

QStandardItem使用 - 因此依赖于 - 几个QtGui类型,例如QIconQBrush,因此它必须是QtGui的一部分。

所以,正如我所说,我理解你的挫败感,但是,为了保持相当通用的Qt代码,它实际上非常实用。