Qt IVI生成器通讯录示例
此示例展示了如何使用Qt IVI生成器生成模型。
简介
此示例展示了如何使用Qt IVI生成器中的“模型”类型来生成一个qface文件中的模型。
它将仅解释如何使用“模型”类型及其内部工作原理的详细说明。有关Qt IVI生成器的总体介绍,请参阅Qt IVI生成器气候示例。
操作步骤
示例中使用的IDL文件代表一个通讯录API。它包含一个接口,提供联系人模型和一个实际的联系人结构的定义。
interface AddressBook { model<Contact> contacts; void insertContact(int index, Contact contact); } struct Contact { string forename; string name; int phone; }
定义了“联系人”属性,其类型为“model<Contact>”。前端模板将为这个属性创建一个C++属性,类型为QIviPagingModel*。此属性的getter函数在连接后端并初始化属性后将返回一个有效的实例。此QIviPagingModel实例可以从C++以及从QML中使用,并且已经提供了使用所谓的“分页”概念以优化方式检索其数据的基本功能。
对于后端接口,属性类型不同,将是QIviPagingModelInterface指针。这是必需的,因为QIviPagingModel也是QtIvi功能,并且像所有功能一样,它使用后端接口来实现前端与后端的分离。有关更多信息,请参阅概念和架构。
后端插件需要针对每个公开的属性实现QIviPagingModelInterface类。模板backend_simulator已经处理了这个,并生成了所有需要的代码。
配置模拟后端插件
默认情况下,生成的模拟后端不会为模型填充任何数据,因为模板不知道它应该提供什么内容。
对于此用例,可以使用默认注释来配置模拟器以提供静态模拟数据。
这是在example-ivi-addressbook.yaml文件中完成的
Example.IVI.AddressBook: config_simulator: simulationFile: "qrc:/plugin_resource/simulation.qml" Example.IVI.AddressBook.AddressBook#contacts: config_simulator: default: [[ "John", "Doe", "12345" ], [ "Jane", "Doe", "67890" ]]
分配给默认变量的JSON片段被Qt IVI生成器解析,并将用于生成一个模拟后端,该后端创建两个联系人实例并将其返回给联系人模型作为内容。
演示应用
演示应用不是自动生成的,但是一个用于与其它示例类似应用的标准的QQmlEngine设置。
ListView { Layout.fillWidth: true Layout.fillHeight: true model: addressBook.contacts clip: true delegate: ItemDelegate { width: parent.width height: 100 text: model.item.forename + " " + model.item.name } }
模型通过使用addressbook对象中的contacts属性检索,并传递给ListView。委托可以访问实际联系人,通过ItemRole,该角色由QIviPagingModel提供,并通过model.item暴露给QML。
扩展模拟行为
因为backend_simulator模板只能生成存根,它不知道应该为qface文件的insertContact函数实现什么行为。ivigenerator将简单地生成一个打印此函数尚未实现的存根实现。
通过使用simulationFile注解来告诉autogenerator我们想要提供自己的模拟QML文件,可以解决这个问题。
在示例中,simulationFile注解指向资源文件中的QML文件。资源文件通常像这样添加到项目文件中。
RESOURCES += plugin_resource.qrc
在QML中提供模拟行为
自动生成的模拟后端代码使用QIviSimulationEngine从QML文件中加载模拟行为。这个特别的引擎确保自动生成的后端接口提供给QML文件,并在那里扩展。它还确保接口仅对当前引擎实例可用,而对在同一进程中运行的其他引擎(例如在前端)不可用。有关引擎的更多信息,请参阅QIviSimulationEngine文档。
使用ivigenerator进行模拟后端时,模拟接口在example.ivi.addressbook.simulation uri中提供。提供的类型名称根据模拟后端实现的后端接口命名。在我们的示例中注册了两个类型:
- AddressBookBackend
- ContactsModelBackend
我们的模拟QML文件如下所示:
import QtQuick 2.0 import Example.IVI.AddressBook.simulation 1.0 Item { AddressBookBackend { id: backend property var settings : IviSimulator.findData(IviSimulator.simulationData, "AddressBook") function initialize() { print("AddressBookSimulation INITIALIZE") IviSimulator.initializeDefault(settings, backend) Base.initialize() } function insertContact(reply, index, contact) { print("BACKEND SIMULATION INSERT CONTACT") contacts.insert(index, contact); reply.setSuccess(true); } Component.onCompleted: { console.log("BACKEND SIMULATION CREATED") } } }
它创建一个AddressBookBackend实例,并在QML代码加载时使用Component.onCompleted处理器打印一条消息。
为了实现insertContact函数的行为,我们在QML中的AddressBookBackend对象中添加了一个JS函数。此函数接受三个参数,第一个参数是一个PendingReply对象,用于在请求成功或失败后通知前端。其他参数如IDL文件中定义的那样。
要向我们的列表中插入提供的联系人,我们使用contacts属性,它包含contacts属性的QIviPagingModelInterface实现。此实现提供了一些额外方便的函数,可以用于模拟以简单的方式修改模型。在我们的情况下,我们只是调用insert()
函数,让自动生成的实现来做剩余的工作。
©2020 The Qt Company Ltd. 本文件中包含的文档贡献是各自所有者的版权。本文件中提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款提供的。Qt及其相关商标是芬兰及/或其他国家和地区的The Qt Company Ltd.的商标。所有其他商标均为各自所有者的财产。