解讀QML之一


http://blog.csdn.net/chenlong12580/article/details/8596342

 

         解讀QML之一

         Qt QML模塊提供了用於實現QML框架的C++類。客戶端可以使用這些類與QML運行時交互(例如:數據注入或調用對象的方法),並從QML文件實例化一個 對象的層次結構。Qt QML模塊提供了許多的C++類,而並非僅僅是列在下面的類。然而列在下面的

類提供了QML運行時的基礎和QML的核心概念。

QML運行時

        一個典型的QML應用程序有一個C++函數的入口點,該入口點是:實例化一個QQmlEngine並且使用QQmlComponent加載一個QML文 檔。引擎(QQmlEngine對象)提供了一個默認的QQmlContext,這是一個頂級的上下文,用於執行定義在QML文檔中的方法和表達式。定義 在QML文檔中的對象層次將會通過調用QQmlComponent實例化對象的create()方法被實例化。

客戶端可能需要通過注入屬性或者對象到上下文中修改引擎提供的默認QQmlContext。它們可以通過調用QQmlEngine::rootContext()方法來訪問頂級的上下文。

        在實例化對象之后,客戶端通常就將控制權傳遞給應用程序的事件循環,以使得用戶輸入時間(例如鼠標點擊)可以被應用程序分發和處理。

注意:Qt Quick模塊提供了一個便利的類:QQuickView,該類提供了QML運行時,以及用於顯示QML應用的可視化窗口。

QQmlEngine類

        QQmlEngine類提供了一個可以用於管理定義在QML文檔中對象集成層次的引擎。它提供了一個根QML上下文,表達式可以在該上下文中執行,並且可以確保在需要的時候可以正確的更新對象的屬性。

QQmlEngine允許一個全局的配置應用到被它管理的所有的對象上。例如:QNetworkAccessManager用於網絡通信,文件路徑用於持久性的存儲。

        可以查看QQmlEngine類文檔獲取更多信息,並且了解到它如何被應用到應用程序中。

QQmlContext類

        QQmlContext類為對象的實例化以及表達式的評估提供了一個上下文環境。所有的對象都在一個特定的上下文中實例化,並且應用程序運行中要執行的表達式都在一個特定的上下文中執行。這個上下文定義了符號是如何被解析的,以及表達式操作的值。

         查看QQmlContext類文檔獲取更多的信息,以及如何獲取一個對象的上下文。

動態對象實例化以及表達式的執行

         動態對象的實例化以及動態表達式的計算都是QML的核心概念。QML文檔定義了可以在運行時通過QQmlComponent實例化的對象類型。一個 QQmlComponent類的實例可以通過C++直接創建,或者是通過Qt.createComponent()方法在QML代碼中創建。屬性表達式可 以在C++中通過QQmlExpression類計算,並且這些表達式可以直接在QML上下文中使用。

QQmlComponent類

        QQmlComponent類可以用來加載QML文檔。它需要QQmlEngine來實例化定義在QML文檔中的對象層次。

        查看QQmlComponent獲取更多的信息,以及如何使用QQmlComponent。

QQmlExpression類

           QQmlExpress類為客戶端提供了一種在C++中執行JavaScript表達式的方式,使用特定了QML計算上下文。這使得客戶端可以通過id訪問QML對象。返回的計算結果的類型是QVariant,並且轉換原則定義在QML引擎中。

查看QQmlExpression類文檔獲取更多的信息,以及如何在應用程序中使用QQmlExpression。

QML的類型系統

在QML文檔中用於定義對象層次的類型無非來源於以下幾種:

    *通過QML語言原生提供

     *使用QML模塊通過C++注冊

     *QML模塊提供的QML文檔

       當然,應用程序開發者也可以提供他們自己的類型:可以直接通過C++類型注冊,也可以在QML文檔中定義可重用的組件,然后導入。

       無論類型的定義來自哪里,引擎都要求這些類型對屬性和實例都是類型安全的。

基本類型

        QML語言有一些內建的原語類型,包括整型,雙精度浮點型,字符串類型以及布爾類型等。對象可以擁有這些類型的屬性,並且這些類型的值可以作為參數傳遞給對象的方法。

        查看QML基本類型文檔獲取更多信息。

       QML支持一系列的基本類型。一個基本類型通常指的是一個簡單的值,例如一個int或者一個string。和QML對象類型做對比,QML對象類型通常指的是一個包含屬性,信號和方法的對象。不同於對象類型,基本類型不能聲明QML對象:例如,不能聲明一個int{}對象或者一個size{}對象。

       基本類型通常這么使用:

     *單個的值(例如:int指一個單個數字,var指條目列表)

     *一個包含了一系列屬性-值對的值(例如:size值包含了width和height屬性的值)

        一些基本類型是引擎默認支持的,使用它們不需要導入聲明,然而其它的基本類型則需要導入模塊后才能使用。所有羅列在下面的類型都可以在QML文檔中作為屬性使用,除了:

      *list必須和一個QML對象一起使用

      *enumeration不能被直接使用,除非枚舉類型被一個注冊的QML對象類型定義

QML語言提供的基本類型

QML模塊提供的基本類型

         QML模塊擴展QML語言提供更多的基本類型。例如:QtQuick模塊提供的基本類型羅列如下:

          目前,只有Qt提供的QML模塊可以提供基本類型,但是這種局面在將來發布的QtQML可能會被改變:我們可以使用一個特定的QML模塊提供的類型,客戶端只需要早QML文檔中導入該模塊。

         一些基本的類型也擁有屬性,例如:font類型就具有pixelSize,family和b屬性。與對象類型的屬性不同的是,基本類型的屬性不提供它們自己屬性改變的信號。因此,僅僅只能為基本類型的屬性創建屬性改變信號的處理者。

        基本類型的任一屬性改變,那么屬性改變的信號就會被發射,例如:


JavaScript類型

         JavaScript對象和數組都被QML引擎支持。任何標准的JavaScript類型都可以使用通用的var類型創建和存儲。

         例如,標准的Date和Array類型都是可使用的:

QML對象類型

        QML對象類型就是那些可以實例化的QML對象。QML對象類型都是從QtObject繼承而來,並且通過QML模塊提供。應用程序可以導入這些模塊繼而使用這些類型。QtQuick模塊提供了大多數在QML中用於創建UI的類型。

每一個QML文檔都隱式的定義了一個QML對象類型,它可以在QML文檔中重用。

        Rectangle就是一個對象類型:它可以被用來創建Rectangle類型的對象。

        自定義的QML對象類型可以通過創建一個定義了該對象類型的.qml文件來完成,或者是通過C++定義QML類型並將該類型注冊到QML引擎。

       通過.qml文件自定義QML類型舉例如下:

        注:還可以通過Component定義匿名類型,如下:


          通過C++定義QML類型舉例:略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM