gpt4 book ai didi

c++ - Qt 模型 View 编程。 QAbstractItemModel 和 QAbstractListModel。指数()和 parent ()

转载 作者:行者123 更新时间:2023-11-28 00:27:45 25 4
gpt4 key购买 nike

请帮助我,我卡住了。

我有一个 QList 结构,我在 QTreeView 中以特定格式显示。我实际上没有显示问题;我重新实现了 data(),它工作得很好。

我的数据是“平坦的”,我。 e.每个节点都是根元素。此外,不需要从 View 中修改数据,即。 e.它是只读的。

我不明白什么是模型索引。它们的正确用法是什么。

目前在 data() 我通过模型 row 返回一个 QList 的对应项(index.row() )。这似乎是合法的,这就是 data() 的用途。

除了 data(),我还重新实现了 rowCount()columnCount()flags()headerData()

对于 QAbstractListModel 来说已经足够了,但是要从 QAbstractItemModel 继承,我还需要重新实现 parent()index ()。而且我不知道在这些功能中我到底需要做什么。如果我返回一个空模型索引(return QModelIndex()),我将不会显示任何数据。

我理解 MVC 的思想: View 能够以最合适和最有用的多种方式显示数据。例如, View 可以按字母顺序或任何方式对数据进行排序,因此显示的行的顺序将与应用程序内部组织数据的方式不同。但我不明白在我的情况下,我的应用程序和 Qt 的情况下,这将如何工作。

View 只是简单地为每一行和每一列查询我模型的 data() 函数,因为我拥有的数据没有被修改,例如。 G。排序后, View 始终以相同的顺序显示数据(即使我单击标题对 View 进行排序)。我可以自己对列表进行排序,但这样我就会失去正确的顺序(例如,应用程序想要获取一个项目 #3,但是在列表排序后,所需的项目已经得到另一个数字),这看起来一点也不像 MVC:当数据 View 发生变化时,数据也会发生变化。不应该。

以上就是问题。代码来了。

嗯,我认为没有太多需要代码来说明我的问题,因为我已经写了足够多的话。我实际上有两个问题:我目前是 QAbstractListModel 的子类,但我想从 QAbstractItemModel 继承。所以我需要写index()parent()。我也不明白排序应该如何工作。

不管怎样,我突然用谷歌搜索了this page .它看起来非常接近我有什么(除了编辑:我不需要用 View 编辑我的数据,所以我没有实现相应的功能;我也显示图片,不是仅文本(没问题))。我想知道如何使用 QAbstractItemModel 执行相同的操作(查看该页面)。

如果我不清楚,请告诉我。 :/

最佳答案

通常,如果 QAbstractListModelQAbstractTableModel 适合您的任务,您应该使用它而不是 QAbstractItemModel。你没有说你为什么要从 QAbstractItemModel 派生。

但是你的问题还是可以回答的:

  1. 由于您的数据是扁平的,因此您应该始终在 parent() 方法中返回 QModelIndex()

  2. index() 方法中,如果行和列有效,您应该返回 createIndex(row, column),并且 QModelIndex() 否则。您可以使用 createIndex 的第三个参数将附加数据附加到索引。

排序是另一个问题。 Qt 建议将数据模型逻辑和排序逻辑分开。您应该有一个包含主要数据的基本模型。这个模型应该完全不知道任何排序。您应该使用 QSortFilterProxyModel 对象作为 View 的模型,并使用 QSortFilterProxyModel::setSourceModel 为排序模型设置数据源模型。代理模型会做所有的排序工作,你只需要告诉它做什么。

关于c++ - Qt 模型 View 编程。 QAbstractItemModel 和 QAbstractListModel。指数()和 parent (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24211053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com