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()函数,让自动生成的实现来做剩余的工作。

示例项目 @ code.qt.io

©2020 The Qt Company Ltd. 本文件中包含的文档贡献是各自所有者的版权。本文件中提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款提供的。Qt及其相关商标是芬兰及/或其他国家和地区的The Qt Company Ltd.的商标。所有其他商标均为各自所有者的财产。