1. 程式人生 > >在Qt Quick中一個簡單Hello World載入過程

在Qt Quick中一個簡單Hello World載入過程

 

Qt5基本類圖:

 

 

 


QQmlEngine
    QQmlEngine類提供了一個QML引擎,用於管理由QML文件定義的物件層次架構,QML提供了一個預設的QML上下文(根上下文,獲取函式QQmlEngine::rootContext())。該上下文是QML表示式的執行環境,並且保證在使用時物件屬效能夠被正確更新。
    QQmlEngine可以將全域性設定應用到其管理下的所有QML物件,比如網路通訊:QNetworkAccessManager、全域性永久(整個程式生命週期)儲存的檔案路徑(資源預載入)等

QQmlContext
    QQmlContext提供了物件例項化和表示式執行所需要的上下文環境。所有的QML物件都要在特定的上下文中例項化,所有的表示式都要在特定的上下文中執行。上下文以根上下文為主組成層次結構,子上下文繼承父上下文的屬性,修改子上下文的屬性值可以覆蓋父上下文的屬性值。
    QQmlContext::setContextProperty()能夠通過名字將資料顯示繫結到上下文,定義、更新上下文的屬性
【注意】使用QQmlContext::setContextProperty()顯示設定物件的屬性會優先於上下文物件的屬性

QQmlComponent
    QML文件定義的物件型別可以在執行時使用QQmlComponent類進行例項化,QQmlComponent封裝了QML元件(component)的定義,可以用於載入QML文件,前提條件是需要QQmlEngine例項化QML文件中定義的物件層次結構。
    QQmlComponent例項既可以使用C++直接建立,也可以通過Qt.createComponent()函式在QML程式碼中建立

QQmlExpression
    動態執行表示式QQmlExpression允許客戶端,在C++中利用一個特定的QML上下文執行JavaScript表示式,表示式執行的結果以QVariant的形式返回,並且遵守QML引擎確定的轉換規則。


載入過程
每一個,Qt Quick函式都必須要有唯一 一個QQmlEngine引擎用於載入QML檔案,唯一 一個QQmlContext用於QML物件例項化和表示式執行的上下文環境,一個QQmlComponent元件用於例項化第一個QML物件。一般QML載入方式有兩種。

1、QGuiApplication + QQmlApplicationEngine + Window
我們在Qt Creator新建一個Qt Quick的hello world工程都是預設使用這種方式載入的。由上圖的繼承關係可以看出,
QGuiApplication:會呼叫父類的輪詢函式 [static] int QCoreApplication::exec(),讓Qt函式一直在跑在主執行緒輪詢
QQmlApplicationEngine:使用父類的QQmlEngine引擎用於載入QML檔案
Window:這是QML中主節點,對於的C++類是QQuickWindow,是一個視覺化的QML物件
******************************* main.cpp **************************************
#include <QGuiApplication>
#include <QQmlApplicationEngine>
intmain(intargc,char*argv[])
{
QGuiApplication app(argc,argv);
QQmlApplicationEngine engine; //QML引擎物件
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); //使用引擎直接載入QML物件進行例項化
returnapp.exec(); //qt輪詢函式,在主執行緒輪詢
}
******************************* main.qml **************************************
importQtQuick2.3
importQtQuick.Window2.2
Window{ //視覺化的QML物件
visible:true
Text{
text:qsTr("HelloWorld")
anchors.centerIn:parent
}
}
此方法還有一種經常使用的寫法:
QQmlEngine engine;                                                                                 //QML引擎
QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml")));       //使用QQmlComponent載入QML物件
QObject* object = component.create();                   //用QQmlComponent建立一個元件的例項化,並且賦值給object*,這步操作非常關鍵,Object型別可以轉換其他任意型別,比如QQuickItem
object->setProperty("width", 500);                                                           //元物件系統賦值操作
QQmlProperty(object, "width").write(500);                                              //元物件系統賦值操作
QQuickItem* item = qobject_cast<QQuickItem*>(object);                    //把 QObject* 轉換成 QQuickItem* 型別
tiem->setWidth(500);                                                                               //QQuickItem* 賦值操作

 

2、QGuiApplication + QQuickView + Item
QGuiApplication:會呼叫父類的輪詢函式 [static] int QCoreApplication::exec(),讓Qt函式一直在跑在主執行緒輪詢
QQuickView:使用父類的顯示函式進行顯示[slot] void QWindow::show()
Item:這是QML中主節點,對於的C++類是QQuickItem,是一個不可視的QML物件,所以依賴C++的顯示
例子:
******************************* main.cpp **************************************
#include <QGuiApplication>
#include<QQuickView>
#include<QQuickItem>
intmain(intargc,char*argv[])
{
QGuiApplication app(argc,argv);
QQuickView view;                                                                       //QQuickView物件
view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));       //載入QML
view.show();                                                                                //QQuickView可以顯示視覺化QML物件
QQuickItem* item = view.rootObject();                                    //返回當前QQuickView的根節點
tiem->setWidth(500);                                                                //QQuickItem* 賦值操作
returnapp.exec(); //qt輪詢函式,在主執行緒輪詢
}
---------------------
作者:西_瓜_瓜
來源:CSDN
原文:https://blog.csdn.net/xi_gua_gua/article/details/62238497
版權宣告:本文為博主原創文章,轉載請附上博文連結!