模型
要与Qt应用程序中的列表交互,您将使用Qt的ListView类。这些基于Model-View-Controller (MVC)模式。同样,QtInterfaceFramework具有以下类来支持此用例,以使用您自己的模型。
除了使用上述类之一创建独立的模型外,您还可以提供是现有功能属性的模型。
QIfAbstractFeatureListModel
假设您必须设计一个像连接的手机中的联系人列表这样的功能。您可以使用通过QIfAbstractFeature派生来实现的QtInterfaceFramework的前端和后端分离。然后,您使用派生自QAbstractItemView的子类以列表形式显示您的联系人。
QtInterfaceFramework为此用例提供QIfAbstractFeatureListModel。该类从QAbstractListModel派生,但也提供了从QIfAbstractFeature的所有功能。
QIfPagingModel
QIfPagingModel是一个列表模型,它通过使用众所周知的分页概念来仅在需要时从后端加载内容。此模型提供两种不同的模式,以确定何时以及如何检索数据以及在每阶段检索多少项目。
获取模式
由于我们无法控制数据提供者的接口,QIfPagingModel支持两种获取模式
- 如果模型的项数在开始时未知,请使用FetchMore模式。此模式在需要时从后端获取一定数量的项;后端告诉前端是否还有更多数据可以获取。
- 如果模型的项数在开始时已知,请使用DataChanged模式。此模式先用空数据填充整个模型,然后使用QAbstractItemModel::dataChanged()信号将实际内容通知给视图。
有关获取模式的更多详细信息,请参见QIfPagingModel。
模型数据
QIfPagingModel 提供了一种基于项目的经典方法来操作模型;项目由 QIfStandardItem 或其派生类提供。将数据提供给 QIfPagingModel 的最佳方式是创建一个新的从 QIfStandardItem 派生的类。然后,覆盖 name()
和 type()
访问函数。每个 QIfStandardItem 的 name
和 type
属性可以直接从模型的数据 data()
函数中获取。此函数还向项目视图中的代理人(如 ListView)公开了这些属性。此外,ItemRole 提供了对存储的 QIfStandardItem 的 const
指针。使用 元对象系统,从派生类型中获取的所有属性也可以直接通过此指针在 QML 中使用。从 C++ 中,您可以使用 at()
模板函数将此 const
指针直接转换为您需要的类型。
QIfFilterAndBrowseModel
QIfFilterAndBrowseModel 从 QIfPagingModel 派生,以扩展其功能。此类提供了一个支持搜索其内容和浏览一组模型数据的模型。
搜索:过滤和排序
为了过滤和排序,QIfFilterAndBrowseModel 使用 Qt 接口框架查询语言;这使得系统既灵活又强大。
浏览
尽管 Qt 接口框架查询语言支持非常复杂的查询,允许您在列表中过滤内容,但它可能不适合所有用例。使用查询语言,前端开发者定义下一项需要哪些数据。有时,这可能不可能,因为后端已经有一个固定的浏览顺序。例如,DLNA 后端已经指定必须首先选择艺术家,然后才会展示该艺术家的所有专辑列表。
对于这种情况,QIfFilterAndBrowseModel 提供了一些在模型之间导航的方法
- canGoForward(index)
- goForward(index)
- canGoBack()
- goBack()
功能
您可能不需要同时使用上述所有功能;或者您的后端可能不支持所有这些功能。在这种情况下,QIfFilterAndBrowseModel 具有功能功能,其中后端报告它可以支持哪些功能。基于这些信息,只在前端 API 中启用了支持的功能。
修改内容
QIfFilterAndBrowseModel 提供了一些修改模型内容的通用方法
作为 QtInterfaceFramework 特性的模型属性
在某些情况下,你可能需要将模型作为特定QtInterfaceFramework功能的属性。一个很好的例子是一个MediaPlayer功能,在这里,你提供基本的播放功能,如播放状态。此外,你还想提供一个当前播放队列作为模型,以便在ListView中很好地显示。
这个播放队列可能很长,所以向量或列表不是存储它的合适容器。使用QIfPagingModel仅加载项目似乎是合理的结论。
由于QIfPagingModel也是一个QtInterfaceFramework功能,它有自己的后端接口,后端插件需要实现此接口。
每个模型属性都需要映射到后端中唯一的一个模型接口实现,因为每个模型都填充了不同的数据,并且数据请求的时间也不同。最终,每个模型实例都需要维护其自身状态。
为了实现这一概念,我们使用QIfProxyServiceObject将提供的与正确后端接口实例相关的QIfPagingModel实例连接起来。
对于MediaPlayer播放队列示例,我们将实现以下内容
- 对于后端
- 实现QIfPagingModelInterface以检索播放队列项
- 实现MediaPlayer功能接口并返回对播放队列属性的QIfPagingModelInterface实现的指针
- 对于前端
- 从后端检索QIfPagingModelInterface指针
- 创建一个持有QIfProxyServiceObject的QIfPagingModelInterface
- 创建一个QIfPagingModel实例并将QIfProxyServiceObject设置在其上
- 将QIfPagingModel实例返回给开发者
这些步骤已在Qt界面框架生成器中实现,使用model
类型为interface
中的属性。
© 2024 Qt公司有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档是在自由软件基金会发布的GNU自由文档许可协议版本1.3的条款下许可的。Qt及其标志是芬兰的Qt公司及其在全世界其他国家的商标。所有其他商标都是其各自所有者的财产。