Qt Quick學習筆記

  當初接觸Qt時,還是Qt4時代,最先學的是QML和Qt Quick,對Qt的C++部分一竅不通。雖說最先學的是QML和Qt Quick,但也不過是學了些皮毛,後來一直專注於Qt的C++開發,最開始學的就幾乎忘光了。進入Qt5時代以後,QML和Qt Quick都有了長足的進步,最近心血來潮,決定好好學學這一方面的技術,畢竟最先讓我愛上Qt的是QML和Qt Quick,而且這方面的不足總讓我覺得在Qt這方面缺了一塊“拼圖”(這是一個可以逼瘋XX座的問題)。現在就來補上這塊“拼圖”吧!下面把學過的要點記錄下,以防健忘的我學完就不知道還給誰了。


  1. qmlscene

      qmlscene工具可以用來加載qml文件,在測試和調試代碼時非常有用。使用時只需在cmd中輸入如下命令:

      qmlscene --help

      qmlscene <path>

      ......

  2. QML和Qt Quick

      QML(Qt Meta-Object Language),實現並擴展了ECMAScript,是一種語法格式類似於CSS的標記性語言,用於描述用戶界面;

      Qt Quick模塊是開發QML應用程序的標準庫,提供使用QML構建用戶界面所需的一切;

      QML和Qt Quick的關係類似於C++和STL的關係

  3. Qt Quick Application和Qt Quick Controls Application的區別

    建立Qt Quick項目時有兩種項目類型,經過實際對比,建立項目後的模板區別如下:

    (1) Qt Quick Controls Application

      建立項目時有選項Enable native styling可供勾選;

      若勾選了Enable native styling,pro文件內聲明使用widgets模塊,因爲勾選功能依賴於widgets。相對應的,C++代碼中的main函數使用widgets模塊中的QApplication(繼承自QGuiApplication,gui模塊);

      若沒有勾選Enable native styling,pro文件內沒有使用widgets模塊的聲明,因爲Qt Quick Controls裏的控件實現本身並不依賴widgets模塊。相應的,C++代碼中的main函數只能使用gui模塊(無顯式聲明下默認加載)中QGuiApplication;

      生成的main.qml文件中,主窗口使用的是QtQuick.Controls下的ApplicationWindow(繼承自Window,QtQuick.Window下),如果不使用Enable native styling選項,Qt Quick Conrols Application和Qt Quick Application模板項目的區別幾乎僅限於此;

    (2) Qt Quick Application

      pro文件中沒有使用widgets模塊的聲明,相對應C++代碼中的main函數使用QGuiApplication,而不是widgets模塊下的QApplication;

      生成的main.qml文件中,主窗口使用的是QtQuick.Window下的Window,而不是QtQuick.Controls下的ApplicationWindow

  4. QML對象id

    QML的對象id在一個qml文件內必須唯一,且只能小寫字母或下劃線開頭

  5. 翻譯文本

    相對於C++中常用的tr()函數,qml中使用qsTr()

  6. QML中的附加屬性

    QML中的附加屬性有點類似於C#中的附加屬性,讓我想起了WPF中像DockPanel.SetDock()這樣的函數,當然qml中用起來要簡單和強大得多

  7. 控件Style中的control屬性

    control屬性指向控件的實例,可以很方便的獲取所屬控件的一些屬性,從而對樣式做出動態調整,不過編輯器並沒有智能提示,呵呵......

  8. ECMAScript

      Qt文檔中有相關的描述;

      ECMAScript僅僅是一個描述,並不是具體實現了的語言(如JavaScript,QML),QML是針對Qt的ECMAScript的擴展實現;

      ECMAScrip是弱類型的,變量定義只需var即可;

      ECMAScrip的語句末分號可有可無;

      代碼註釋格式和C++是一樣的(//,/**/);

      和Java、C#類似有垃圾收集機制;

      所有函數都有返回值(默認undefined),函數聲明都用function關鍵字開頭,不需要聲明返回值類型和參數類型(你看看var幹啥用的就知道爲什麼了);

      String類型不同於Qt裏的QString,類似於C#中的string類,初始化之後都是隻讀的,處理string類後往往都是返回保存結果的新實例,原來的實例原封不動;

      類(對象定義)的實例創建可以是new,也可以用字面量的形式創建,兩種形式都可以動態添加屬性和方法。不過有趣的是,如果通過字面量的形式創建實例,枚舉屬性的時候,創建時就具有的“先天”屬性都是自動排好序的,而創建後添加屬性則按添加順序排在“先天”屬性的後面;

      console對象很強大,輸出調試信息、斷言、計時器、計數器、性能分析等等一應俱全哦;

      ECMAScript定義了三個內置對象:Global、Math和JSON。三個內置對象提供了很多基礎對象的構造函數和很多有用的工具方法;

  9. Component

      只有在定義內嵌組件時,才需要用Component對象包含組件內容,在獨立文件定義組件時不需要Component對象;

      Component除了定義id和包含一個根Item之外,不能包含其他內容;

      定義組件時頂層Item的id與組件實例的id是相互獨立的;

      在獨立文件中定義的組件,使用方式和Qt Quick中的標準組件完全一致;

  10. Layout中的Image

      Qt Quick核心編程裏,在講到TabView和TabViewStyle時,給出了一段示例代碼,一字不差地敲了一遍運行,結果發現運行結果和書中不一樣。經過研究發現Image放到各種Layout中時的width和height屬性不起作用,只有使用Layout.preferredWidth和Layout.preferredHeight附加屬性才能解決問題,難道這是我使用的Qt版本的Bug?

  11. 動畫

      Animation類的started、stopped信號只有單獨的頂層動畫對象纔會觸發,如果動畫在在動畫分組中、Behavior中或者在Transition中,這兩信號都不會觸發

  12. 按鍵處理Keys

      通過附加屬性Keys可以響應按鍵,其中Keys最爲普通的兩個按鍵pressed和released信號,類似於Qt C++中的keyPressEvent和keyReleaseEvent,這兩個信號帶有一個類型爲KeyEvent,名稱爲event的參數。和Qt C++中類似,處理掉的按鍵應甚至event的accepted屬性爲true,以免繼續傳遞。

      另外,附加了Keys屬性後,還需要設置對應元素的focus屬性爲true才能接收按鍵消息哦。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章