模型

要与Qt应用程序中的列表交互,您将使用Qt的ListView类。这些基于Model-View-Controller (MVC)模式。同样,QtInterfaceFramework具有以下类来支持此用例,以使用您自己的模型。

除了使用上述类之一创建独立的模型外,您还可以提供是现有功能属性的模型

QIfAbstractFeatureListModel

假设您必须设计一个像连接的手机中的联系人列表这样的功能。您可以使用通过QIfAbstractFeature派生来实现的QtInterfaceFramework的前端和后端分离。然后,您使用派生自QAbstractItemView的子类以列表形式显示您的联系人。

QtInterfaceFramework为此用例提供QIfAbstractFeatureListModel。该类从QAbstractListModel派生,但也提供了从QIfAbstractFeature的所有功能。

QIfPagingModel

QIfPagingModel是一个列表模型,它通过使用众所周知的分页概念来仅在需要时从后端加载内容。此模型提供两种不同的模式,以确定何时以及如何检索数据以及在每阶段检索多少项目。

获取模式

由于我们无法控制数据提供者的接口,QIfPagingModel支持两种获取模式

  1. 如果模型的项数在开始时未知,请使用FetchMore模式。此模式在需要时从后端获取一定数量的项;后端告诉前端是否还有更多数据可以获取。
  2. 如果模型的项数在开始时已知,请使用DataChanged模式。此模式先用空数据填充整个模型,然后使用QAbstractItemModel::dataChanged()信号将实际内容通知给视图。

有关获取模式的更多详细信息,请参见QIfPagingModel

模型数据

QIfPagingModel 提供了一种基于项目的经典方法来操作模型;项目由 QIfStandardItem 或其派生类提供。将数据提供给 QIfPagingModel 的最佳方式是创建一个新的从 QIfStandardItem 派生的类。然后,覆盖 name()type() 访问函数。每个 QIfStandardItemnametype 属性可以直接从模型的数据 data() 函数中获取。此函数还向项目视图中的代理人(如 ListView)公开了这些属性。此外,ItemRole 提供了对存储的 QIfStandardItemconst 指针。使用 元对象系统,从派生类型中获取的所有属性也可以直接通过此指针在 QML 中使用。从 C++ 中,您可以使用 at() 模板函数将此 const 指针直接转换为您需要的类型。

QIfFilterAndBrowseModel

QIfFilterAndBrowseModelQIfPagingModel 派生,以扩展其功能。此类提供了一个支持搜索其内容和浏览一组模型数据的模型。

搜索:过滤和排序

为了过滤和排序,QIfFilterAndBrowseModel 使用 Qt 接口框架查询语言;这使得系统既灵活又强大。

浏览

尽管 Qt 接口框架查询语言支持非常复杂的查询,允许您在列表中过滤内容,但它可能不适合所有用例。使用查询语言,前端开发者定义下一项需要哪些数据。有时,这可能不可能,因为后端已经有一个固定的浏览顺序。例如,DLNA 后端已经指定必须首先选择艺术家,然后才会展示该艺术家的所有专辑列表。

对于这种情况,QIfFilterAndBrowseModel 提供了一些在模型之间导航的方法

功能

您可能不需要同时使用上述所有功能;或者您的后端可能不支持所有这些功能。在这种情况下,QIfFilterAndBrowseModel 具有功能功能,其中后端报告它可以支持哪些功能。基于这些信息,只在前端 API 中启用了支持的功能。

修改内容

QIfFilterAndBrowseModel 提供了一些修改模型内容的通用方法

作为 QtInterfaceFramework 特性的模型属性

在某些情况下,你可能需要将模型作为特定QtInterfaceFramework功能的属性。一个很好的例子是一个MediaPlayer功能,在这里,你提供基本的播放功能,如播放状态。此外,你还想提供一个当前播放队列作为模型,以便在ListView中很好地显示。

这个播放队列可能很长,所以向量或列表不是存储它的合适容器。使用QIfPagingModel仅加载项目似乎是合理的结论。

由于QIfPagingModel也是一个QtInterfaceFramework功能,它有自己的后端接口,后端插件需要实现此接口。

每个模型属性都需要映射到后端中唯一的一个模型接口实现,因为每个模型都填充了不同的数据,并且数据请求的时间也不同。最终,每个模型实例都需要维护其自身状态。

为了实现这一概念,我们使用QIfProxyServiceObject将提供的与正确后端接口实例相关的QIfPagingModel实例连接起来。

对于MediaPlayer播放队列示例,我们将实现以下内容

  1. 对于后端
    1. 实现QIfPagingModelInterface以检索播放队列项
    2. 实现MediaPlayer功能接口并返回对播放队列属性的QIfPagingModelInterface实现的指针
  2. 对于前端
    1. 从后端检索QIfPagingModelInterface指针
    2. 创建一个持有QIfProxyServiceObjectQIfPagingModelInterface
    3. 创建一个QIfPagingModel实例并将QIfProxyServiceObject设置在其上
    4. QIfPagingModel实例返回给开发者

这些步骤已在Qt界面框架生成器中实现,使用model类型为interface中的属性。

© 2024 Qt公司有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档是在自由软件基金会发布的GNU自由文档许可协议版本1.3的条款下许可的。Qt及其标志是芬兰的Qt公司及其在全世界其他国家的商标。所有其他商标都是其各自所有者的财产。