翻譯|使用教程|編輯:鮑佳佳|2020-09-24 10:33:42.777|閱讀 830 次
概述:本教程演示了如何使用自動生成的中間件API擴展QML應用程序。我們使用現有的QML Instrument Cluster應用程序并繼續執行以下步驟:集成沒有后端的基本接口;擴展界面并添加注釋;添加模擬后端和相應的模擬注釋;使用QML插件;添加自定義模擬行為;添加擬服務器并從Qt遠程對象后端使用它;開發連接到DBus接口的生產后端。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Qt是一個跨平臺框架,通常用作圖形工具包,它不僅創建CLI應用程序中非常有用。而且它也可以在三種主要的臺式機操作系統以及移動操作系統(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式設備,Android(Necessitas)和iOS的端口上運行。現在我們為你提供了免費的試用版。趕快點擊下載Qt最新試用版吧>>
逐步演示如何基于QML應用程序生成中間件API。
本教程演示了如何使用自動生成的中間件API擴展QML應用程序。我們使用現有的QML Instrument Cluster應用程序并繼續執行以下步驟:
在開始實際的中間件集成之前,讓我們看一下現有的Instrument Cluster QML代碼及其支持的所有功能:
接下來,我們使用中間件API添加對以下功能的支持:
最終目標是將所有這些功能連接在一起,在如下模擬進行實時駕駛體驗:
第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未定義,則自動默認為“前端”模板。有關這些模板的更多詳細信息,請參見使用生成器。
簡而言之,“前端”模板會生成:
要檢查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類開發工具QtitanRibbon、QtitanChart、QtitanNavigation、QtitanDocking、QtitanDataGrid在線訂購現直降1000元,歡迎咨詢慧都獲取更多優惠>>
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: