【问题标题】:Tree models in PysidePyside 中的树模型
【发布时间】:2016-10-04 17:02:51
【问题描述】:

也许我只是在想这一切都错了,但在我看来,要在 Qt 中拥有一个工作树模型,需要将数据包装在一个项目类中,这对我来说似乎很奇怪。。 p>

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

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

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

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

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

如果有人能证明这个设计是合理的,请解释我是如何误解它的,(或者只是与我的挫败感有关)我很想听听!

谢谢!

【问题讨论】:

    标签: qt treeview pyside model-view


    【解决方案1】:

    多年来(几十年?)实施了大量基于 QAbstractItemModel 的数据模型,我理解您的沮丧,但是......

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

    一点也不。很简单,在很多情况下,将模型行封装在自己的类中是有意义的——每一列代表项目的不同属性(例如,想想你将如何实现 QFileSystemModel)。

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

    您可以直接使用QAbstractItemModel::data和QAbstractItemModel::setData获取/设置数据

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

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

    我隐约知道 QStandardItem 和 QStandardItemModel,但我发现自己在问为什么它们是 QtGui 而不是 QtCore 的一部分,就像其他模型和模型项一样。

    QStandardItem 使用 -- 并因此依赖于 -- 几种 QtGui 类型,例如 QIcon 和 QBrush,因此它必须是 QtGui 的一部分。

    所以,正如我所说,我理解您的沮丧,但是,为了保持相当通用,Qt 代码实际上非常有用。

    【讨论】:

    • 听到这话让人松了一口气——在我看来,data/setData 方法应该能够直接提供数据。但是,我发现很难在任何地方看到这一点,即使在官方 Qt 示例中也是如此。如果你能提供一个 2 深度树模型的实现,那将对我有很大帮助。我知道我需要定义一些方法,例如 createIndex() 和 parent,但是如何在内部(或在与视图通信时)使用这些方法似乎有点不透明。
    • 也许我最苦恼的事情是理解操作流程和(感觉像)循环依赖。向数据请求传递一个索引,该索引来自 createIndex(),它传递了一行、col、父项——父项来自一个具有索引的子项,但该索引与父项相关—— - 我迷路了。
    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多