模型

为了与Qt应用中的列表进行交互,通常您会使用基于模型-视图-控制器(MVC)模式的Qt的ListView类。同样,QtIvi也有以下类来支持此用例,以便您提供自己的模型

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

QIviAbstractFeatureListModel

假设您需要设计类似于连接到手机的联系人列表的功能,您可以使用QtIvi的前端/后端分离,通过从QIviAbstractFeature派生来实现。然后,您使用您的子类与从QAbstractItemView派生的类来以列表形式显示您的联系人。

QtIviCore提供了QIviAbstractFeatureListModel以支持此用例。此类从QAbstractListModel派生,但同时也提供了来自QIviAbstractFeature的所有功能。

QIviPagingModel

QIviPagingModel是一个列表模型,它使用众所周知的分页概念,仅在需要时从后端加载内容。此模型提供两种不同的模式,用于确定数据和每次应检索的项目数量。

获取模式

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

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

有关获取模式的详细信息,请参阅QIviPagingModel

模型数据

QIviPagingModel提供了一种基于项目的经典方法来与模型交互;项目由QIviStandardItem或其派生类提供。向QIviPagingModel提供数据最好的方法是创建一个从QIviStandardItem派生的新的类。然后,重写name()type()获取器函数。每个QIviStandardItemnametype属性可以直接从模型的data()函数中检索。此函数还将这些属性暴露给项目视图的代理,例如ListView。此外,ItemRole提供了一个指向存储的QIviStandardItem的常量指针。使用元对象系统,从派生类型公开的所有属性也都可以通过此指针直接在QML中使用。从C++,您可以使用at()模板函数将此常量指针直接转换为所需类型。

QIviSearchAndBrowseModel

QIviSearchAndBrowseModel是从QIviPagingModel派生的,以扩展其功能。此类提供了一个支持搜索内容和通过一系列模型数据浏览的模型。

搜索:筛选和排序

为了过滤和排序,QIviSearchAndBrowseModel使用Qt IVI查询语言;这使得系统既灵活又强大。

浏览

尽管Qt IVI查询语言支持非常复杂的查询,可以过滤列表中的内容,但它可能不适用于所有用例。使用查询语言,前端开发人员定义了下一步需要哪些数据。有时这不可能,如果后端已经有一个固定的浏览顺序。例如,DLNA后端已经指定必须首先选择艺术家,然后才能显示该艺术家所有专辑的列表。

对于这种情况,{QIviSearchAndBrowseModel::QIviSearchAndBrowseModel}{QIviSearchAndBrowseModel}提供了一些方法来在模型之间导航

功能

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

修改内容

{QIviSearchAndBrowseModel::QIviSearchAndBrowseModel}{QIviSearchAndBrowseModel}提供了一些通用的方法来修改模型的内容

作为QtIvi功能的属性的模型

在某些情况下,您可能需要一个模型作为特定QtIvi功能的属性。一个很好的例子是MediaPlayer功能,其中您提供基本的播放功能,如播放状态。此外,您还希望提供一个显示在ListView内部的好看的当前播放队列的模型。

此播放队列可能很长,向量或列表不是存储它的适当容器。使用{QIviPagingModel::QIviPagingModel}{QIviPagingModel}只加载项,是一个合理的结论。

因为{QIviPagingModel::QIviPagingModel}{QIviPagingModel}也是一个QtIvi功能,它有自己的后端接口,后端插件需要实现。

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

为了实现这个概念,我们使用QIviProxyServiceObject来连接与提供的{QIviPagingModel::QIviPagingModel}{QIviPagingModel}实例对应的正确后端接口实例。

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

  1. 对于后端
    1. 实现QIviPagingModelInterface以检索播放队列项
    2. 实现MediaPlayer功能接口,并返回播放队列属性QIviPagingModelInterface实现的指针
  2. 对于前端
    1. 从后端检索QIviPagingModelInterface指针
    2. 创建一个包含QIviPagingModelInterfaceQIviProxyServiceObject
    3. 创建一个QIviPagingModel实例并将QIviProxyServiceObject设置在其上
    4. QIviPagingModel实例返回给开发者

所有这些步骤已在IVIGenerator中实现,通过在接口中的属性使用model类型。

©2020 Qt公司有限公司。包含在此文档中的文档贡献是各自所有者的版权。提供的文档是根据自由软件基金会发布的GNU自由文档许可第1.3版的条款许可的。Qt及其相关标志是芬兰及其它全球国家的Qt公司商标。所有其他商标均为各自所有者的财产。