QML和C++混合編程--Qt聲明式用戶界面運行環境

1. QML文件通過QML運行環境進行加載和執行。

    這包括聲明式用戶界面引擎和內建的QML元素與插件模塊,它允許對第三方QML元素和模塊的訪問。

    使用QML的應用程序需要調用QML運行環境來執行QML運行環境來執行QML文檔,這可以通過創建QDeclarativeview或者QDeclarativeEngine來完成。

    另外,聲明式用戶界面包含了Qt QML Viewer工具,它可以用來加載.qml文件。該工具可以用來開發和測試QML代碼,而不需要編寫C++應用程序來加載QML運行環境。

    Qt Declarative UI Runtime,Qt QML Viewer。

2. 要部署使用了QML的應用程序,必須在應用程序中調用QML運行環境。

     這可以通過編寫一個Qt C++應用程序,然後通過QDeclarativeView實例來加載QML文件,

     或者創建一個QDeclareEngine實例然後使用QDeclarativeView實例來加載QML文件。具體使用哪種方法依賴於已經存在的用戶界面代碼的特點。

     Integrating QML with existing Qt UI code關鍵字

一、使用QDeclarativeView來部署

     如果已經擁有一個基於QWidget的用戶,可以使用QDeclarativeView將QML部件整合進來。QDeclarativeView是QWidget的子類,所以可以像其他QWidget部件一樣將其添加到用戶界面。使用QDeclarativeView::setSource()來加載一個QML文件到視圖中,然後將該視圖添加到用戶界面中。

    在.pro中添加代碼

QT + = declaretive
    必須添加declaretive模塊纔可以在Qt程序中顯示QML文件的內容。

#include <QDeclarativeView>

QDeclarativeView view;
view.setSource(QUrl("../myDeclarativeView/application.qml"))
view.show();
    使用這種方式缺點:與QWidget相比,QDeclarativeView初始化很慢,而且會使用更多的內存。如果創建了大量的QDeclarativeView對象會導致性能下降。如果發生了這種情況,一個比較好的方法是在QML中重寫這些部件,然後在主QML部件中加載這些部件,而不要使用QDeclarativeView。

    注意,與QML相比,QWidget是爲多種不同類型的用戶界面設計的,所以將基於QWidget的應用程序和QML相連接並不總是一個好主意。如果用戶界面是由少量複雜的靜態元素組成,那麼最好使用QWidget部件來實現;而如果用戶界面由大量簡單和動態的元素組成,那麼最好使用QML來實現。

二、直接創建一個QDeclarativeEngine

      如果在application.qml中沒有包含任何的圖形組件,或者由於其他原因需要避免使用QDeclarativeView,那麼就可以直接創建QDeclarativeEngine。在這種情況下,application.qml會被作爲一個QDeclarativeCompnent實例進行加載,而不是顯示在一個視圖中。

#include <QDeclarativeEngine>
#include <QDeclarativeContext>
#include <QDeclarativeComponent>

    QDeclarativeEngine engine;
    QDeclarativeContext * objectContext =
            new QDeclarativeContext(engine.rootContext());
    QDeclarativeComponent component(&engine, "application.qml");
    QObject * object = component.create(objectContext);
    如果已經擁有了一個基於圖形視圖框架的用戶界面,那麼可以使用這種方式直接將QML部件整合到QGraphicsSence中。例如將QML部件整合到QGraphicsScene中。

QGraphicsScene * scene = myExistingGraphicsScene();
    QDeclarativeEngine * engine = new QDeclarativeEngine;
    QDeclarativeComponent component(engine, Qurl::fromLocalFile("application.qml"));
    QObject * object =
            qobject_cast<QGraphicsObject *>(component.create());
    scene->addItem(boject);
    使用QGraphicsView選項可以優化QML用戶界面的表現:

QGraphicsView::setOptimizationFlags(QGraphicsView::DontSavePainterState);
QGraphicsView::setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
QGraphicsScene::setItemIndexMethod(QGraphicsScene::NoIndex);
    還有一種方法是將現有的QGraphicsWidget對象暴露給QML,並且在QML中創建場景。參考Basic Graphics Layouts Example示例程序。




  




發佈了66 篇原創文章 · 獲贊 16 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章