Qt开发实战:基于QML应用程序生成中间件API

翻译|使用教程|编辑:鲍佳佳|2020-09-24 10:33:42.777|阅读 14 次

概述:本教程演示了如何使用自动生成的中间件API扩展QML应用程序。我们使用现有的QML Instrument Cluster应用程序并继续执行以下步骤:集成没有后端的基本接口;扩展界面并添加注释;添加模拟后端和相应的模拟注释;使用QML插件;添加自定义模拟行为;添加拟服务器并从Qt远程对象后端使用它;开发连接到DBus接口的生产后端。

# 正版采购狂欢节,企业采购正当时 #

Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。赶快点击下载Qt最新试用版>>

点击获取更多文章教程

逐步演示如何基于QML应用程序生成中间件API。

本教程演示了如何使用自动生成的中间件API扩展QML应用程序。我们使用现有的QML Instrument Cluster应用程序并继续执行以下步骤:

  1. 集成没有后端的基本接口
  2. 扩展界面并添加注释
  3. 添加模拟后端和相应的模拟注释;使用QML插件
  4. 添加自定义模拟行为
  5. 添加模拟服务器并从Qt远程对象后端使用它
  6. 开发连接到DBus接口的生产后端

在开始实际的中间件集成之前,让我们看一下现有的Instrument Cluster QML代码及其支持的所有功能:

  • images -此文件夹包含QML代码中使用的所有图像。
  • Cluster.qml -将所有其他QML组件组装在一起的主要QML文件。
  • Dial.qml -使用指针显示速度或每分钟转数(RPM)等值的基本组件。
  • Fuel.qml -显示实际燃油水平的组件。
  • Label.qml -一个小的帮助程序组件,用于设置用于显示文本的所有常用设置。
  • LeftDial.qml -使用Dial组件并以文本形式显示当前速度,以及以英里每小时(mph)或每小时公里(km / h)为单位的当前度量。
  • RightDial.qml -显示当前的RPM并提供显示警告指示器的方法。
  • Top.qml -顶部栏显示当前日期和当前温度。

接下来,我们使用中间件API添加对以下功能的支持:

  • 在左转盘中显示当前速度。
  • 在右转盘中显示当前RPM。
  • 在不同指标之间进行更改。
  • 在顶部栏中显示当前温度。
  • 在右转盘上显示不同的警告。
  • 指示组合仪表是否已连接并显示实际数据。

最终目标是将所有这些功能连接在一起,在如下模拟进行实时驾驶体验:

第1章:使用IVI Generator的基本Middlware API

在本章中,我们将中间件API集成到现有的Instrument Cluster QML代码中。在大多数基本的QML示例中,我们不会自己手动编写这些部分,而是使用IVI Generator自动生成所需的部分。

接口定义语言

为了能够自动生成中间件API,IVI Generator需要一些有关生成内容的输入。此输入以接口定义语言(IDL)QFace的形式给出,它以非常简单的方式描述了API。

现在我们将开始定义一个非常简单的接口,为我们提供speed属性:

module Example.IVI.InstrumentCluster 1.0

interface InstrumentCluster {
    int speed;
}

首先,我们需要定义我们要描述的模块。该模块充当名称空间,因为IDL文件可以包含多个接口。

module Example.IVI.InstrumentCluster 1.0

该模块最重要的部分是其接口定义。

interface InstrumentCluster {
    int speed;
}

在这种情况下,我们定义了一个InstrumentCluster由一个属性组成的接口。每个属性定义必须至少包含一个类型和一个名称。大多数基本类型是内置的,可以在QFace IDL语法中找到。

自动生成

现在我们的IDL文件的第一个版本已经准备好了,是时候使用IVI Generator工具从中自动生成API了。与moc相似,此自动生成过程已集成到qmake Build System中,并在编译时完成。

在以下.pro文件中,我们基于IDL文件构建一个C ++库:

TARGET = $$qtLibraryTarget(QtIviInstrumentCluster)
TEMPLATE = lib
DESTDIR = ..

QT += ivicore ivicore-private qml quick

DEFINES += QT_BUILD_EXAMPLE_IVI_INSTRUMENTCLUSTER_LIB
CONFIG += ivigenerator
QFACE_SOURCES = ../instrument-cluster.qface

该.pro文件的大部分是一个标准设置,用于定义一个C ++库,使用“ lib” TEMPLATE并在TARGET变量中定义所需的文件名。对于qtLibraryTarget提供调试信息的库,我们使用的功能有助于在文件名上正确附加“ d”后缀。将来,我们需要链接此文件,因此我们将设置DESTDIR为上层目录以简化此过程。

注意: Windows会自动在同一目录中搜索库。

激活IVI Generator集成需要CONFIG变量指定ivigenerator选项。这可确保在指定的QFACE_SOURCES中使用QFace文件在构建过程中调用IVI Generator 。

为了确保我们构建的库可以在Windows上运行,添加QT_BUILD_EXAMPLE_IVI_INSTRUMENTCLUSTER_LIB到DEFINES变量中很重要。这样,在构建库时将导出所有符号,但在链接它时将导入所有符号。

自动生成哪些文件

IVI Generator基于生成模板工作。这些模板定义应从QFace文件生成什么内容。如果QFACE_FORMAT未定义,则自动默认为“前端”模板。有关这些模板的更多详细信息,请参见使用生成器。

简而言之,“前端”模板会生成:

  • QFace文件中每个接口的从QIviAbstractFeature派生的C ++类
  • 一个模块类,有助于注册到QML的所有接口并存储全局类型和函数。

要检查C ++代码,可以在库的build文件夹中查看这些文件。

现在,对我们来说最重要的自动生成的文件是所定义接口的结果C ++类。

/****************************************************************************
** Generated from 'Example.IVI.InstrumentCluster.qface'
**
** Created by: The QFace generator (QtAS 5.15.0)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#ifndef INSTRUMENTCLUSTER_INSTRUMENTCLUSTER_H_
#define INSTRUMENTCLUSTER_INSTRUMENTCLUSTER_H_

#include "instrumentclustermodule.h"

#include <QtIviCore/QIviAbstractFeature>
#include <QtIviCore/QIviPendingReply>
#include <QtIviCore/QIviPagingModel>

class InstrumentClusterPrivate;
class InstrumentClusterBackendInterface;

class Q_EXAMPLE_IVI_INSTRUMENTCLUSTER_EXPORT InstrumentCluster : public QIviAbstractFeature
{
    Q_OBJECT
    Q_PROPERTY(int speed READ speed WRITE setSpeed NOTIFY speedChanged)

public:
    explicit InstrumentCluster(QObject *parent = nullptr);
    ~InstrumentCluster();

    static void registerQmlTypes(const QString& uri, int majorVersion=1, int minorVersion=0);

    int speed() const;

public Q_SLOTS:
    void setSpeed(int speed);

Q_SIGNALS:
    void speedChanged(int speed);

protected:
    InstrumentClusterBackendInterface *instrumentclusterBackend() const;

    void connectToServiceObject(QIviServiceObject *service) Q_DECL_OVERRIDE;
    void clearServiceObject() Q_DECL_OVERRIDE;

private:
    Q_PRIVATE_SLOT(d_func(), void onSpeedChanged(int speed))
    Q_DECLARE_PRIVATE(InstrumentCluster)
};


#endif // INSTRUMENTCLUSTER_INSTRUMENTCLUSTER_H_

如您所见,自动生成的C ++类实现了我们先前在QFace文件中定义的speed属性。通过使用Q_OBJECT和Q_PROPERTY宏,该类现在可以直接在您的QML代码中使用。

将前端库与QML代码集成

对于此集成,我们使用QML代码中自动生成的前端库。为了简单起见,我们遵循标准的Qt示例模式,并使用一个小的C ++ main函数,该函数将我们自动生成的类注册到QML中并将Instrument Cluster QML代码加载到QQmlApplicationEngine中:

#include "instrumentclustermodule.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    InstrumentClusterModule::registerQmlTypes();
    engine.load(QUrl(QStringLiteral("qrc:///Cluster.qml")));

    return app.exec();
}

现在,我们需要的是InstrumentCluster QML元素的实际集成并将该speed属性连接到leftDial。这是通过首先使用instrumentClusterID 实例化元素来完成的。

import QtQuick 2.1
import QtQuick.Window 2.2
import Example.IVI.InstrumentCluster 1.0

Window {
    id: root

    width: 1920
    height: 720
    title: qsTr("QtIVI Instrument Cluster Chapter 1")
    visible: true
    color: "#0c0c0c"

    InstrumentCluster {
        id: instrumentCluster
    }

最后,我们可以为LeftDial项的value属性创建一个绑定到InstrumentCluster API的speed属性。

 LeftDial {
        id: leftDial
        anchors.left: parent.left
        anchors.leftMargin: 0.1 * width

        value: instrumentCluster.speed
    }

未完待续。。。。。。。

本篇文章中的内容你都学会了吗?如果这篇文章没能满足你的需求、点击获取更多文章教程!现在立刻下载Qt免费试用吧!更多Qt类开发工具QtitanRibbonQtitanChartQtitanNavigationQtitanDockingQtitanDataGrid在线订购现直降1000元,欢迎咨询慧都在线客服获取更多优惠>>



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

文章转载自:Qt

登录 慧都网发表评论


暂无评论...

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
title
相关厂商
相关产品
Qt

一个跨平台的C++图形用户界面应用程序开发框架。

在线
客服
咨询
电话
400-700-1020
在线
QQ
购物车 反馈 返回
顶部
在线客服系统
live chat