本教程演示了如何使用自动生成的中间件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应用程序并继续执行以下步骤:
- 集成没有后端的基本接口
- 扩展界面并添加注释
- 添加模拟后端和相应的模拟注释;使用QML插件
- 添加自定义模拟行为
- 添加模拟服务器并从Qt远程对象后端使用它
- 开发连接到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.0interface 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 = libDESTDIR = ..QT += ivicore ivicore-private qml quickDEFINES += QT_BUILD_EXAMPLE_IVI_INSTRUMENTCLUSTER_LIBCONFIG += ivigeneratorQFACE_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.1import QtQuick.Window 2.2import Example.IVI.InstrumentCluster 1.0Window { 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类开发工具QtitanRibbon、QtitanChart、QtitanNavigation、QtitanDocking、QtitanDataGrid在线订购现直降1000元,欢迎咨询在线客服获取更多优惠>>

标签:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!