【发布时间】:2014-06-13 17:42:57
【问题描述】:
请帮帮我,我卡住了。
我有一个QList 在 QTreeView 中以特定格式显示的结构。我实际上对显示没有问题;我重新实现了data(),效果很好。
我的数据是“平坦的”,即。 e.每个节点都是一个根元素。此外,不需要从视图中修改数据,即。 e.它是只读的。
我不明白什么是模型索引。它们的正确用途是什么。
目前在data(),我通过模型row (index.row()) 返回了QList 的对应项。这似乎是合法的,这就是 data() 的用途。
除了data(),我还重新实现了rowCount()、columnCount()、flags()和headerData()。
对于QAbstractListModel 来说已经足够了,但是要从QAbstractItemModel 继承,我还需要重新实现parent() 和index()。而且我不知道在这些函数中我到底需要做什么。如果我返回一个空模型索引 (return QModelIndex()),则不会显示任何数据。
我理解 MVC 的理念:视图能够以多种最合适和最有用的方式显示数据。例如,视图可以按字母顺序或任何方式对数据进行排序,因此显示的行的顺序将不同于数据在应用程序内部的组织方式。但我不明白这在我的情况下如何工作,我的应用程序和 Qt 的情况。
视图只是简单地为每一行和每一列查询我的模型的data() 函数,并且因为我拥有的数据没有被修改,例如。 G。排序后,视图总是以相同的顺序显示数据(即使我单击标题对视图进行排序)。我可以自己对列表进行排序,但是我会丢失正确的顺序(例如,应用程序想要获取一个项目#3,但在列表排序之后,需要的项目有另一个数字),这并没有完全不像 MVC:当数据视图发生变化时,数据也会发生变化。不应该。
以上是问题。代码来了。
好吧,我认为不需要代码来说明我的问题,因为我已经写了足够多的字。我实际上有两个问题:我目前从QAbstractListModel 继承,但我想从QAbstractItemModel 继承。所以我需要写index()和parent()。我也不明白排序应该如何工作。
不管怎样,我突然用谷歌搜索了this page。它看起来非常接近我所拥有的(除了编辑:我不需要用视图编辑我的数据,所以我没有实现相应的功能;我也显示图片,而不是仅文本(没问题))。我想知道如何使用QAbstractItemModel 做同样的事情(查看该页面)。
如果我不清楚,请告诉我。 :/
【问题讨论】:
-
你真正想要得到什么样的数据布局?一些节点的列表,其中哪些有一些与您的项目字段相关联的子节点?
-
@Lol4t0 不,我已经在我的帖子中指出了这一点:
My data is "flat", i. e. every node is a root element。它基本上是一个字符串列表(几列)的 QList。我使用QTreeView而不是QListView只是因为QListView没有标题。QListView的文档说如果我需要一个标题,我应该使用QTreeView。 -
@Lol4t0 我更新了我的评论。这是一个字符串列表的QList,所以我有几列。我也在一些专栏中展示了一些图片,但这不是主题。
-
哦,我还以为是你目前的情况,你想改变布局。您可以将 ListModel 与 TreeView 一起使用(反之亦然)。模型和视图完全独立。
-
@Lol4t0 你的 ListModel 是什么?我知道我可以从
QAbstractListModel继承。但请重新阅读问题。 :)
标签: c++ qt model-view-controller model qt4