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中輸入以下命令:ide

      qmlscene --help函數

      qmlscene <path>工具

      ......性能

  2. QML和Qt Quick測試

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

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

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

  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才能接收按鍵消息哦。

相關文章
相關標籤/搜索