最近在學QML,感受也不難,就是一直以來接觸 Qt 的腳本類的東西的順序是Script、Quick一、Declarative、Quick二、QML。那麼每個都是幹什麼的呢,這些東西搞的我有點混亂,因此決定把他們的大概都先弄清楚,以便更好地學習。api
先去扒一下它們的歷史。框架
QtScript 從 Qt 4.3 開始引入。
Qt Quick1 從 Qt 4.7 開始引入。
Qt Quick1 包含 Qt Declarative 模塊、QML。
Qt Quick1.1 從 Qt 4.8 開始引入。
Qt Quick2 從 Qt 5 開始引入。學習
QtScript是基於 ECMAScript 的腳本語言,關於 ECMAScript 能夠查看 W3School:ECMAScript。ui
在腳本中能夠訪問原有C++代碼中的QObject類型及其子類的實例,鏈接信號和槽;也能夠建立QObject類型及其子類的實例。設計
可是QtScript並不能獨立運行,必須和C++代碼配合才能實現完整的功能。教程
相似QtPlugins,在QtScript的也能夠製做Plugins。QtPlugins爲C++開發提供擴展;而QtScript Plugins爲script開發提供擴展。ip
能想到的比較典型的應用是:在QIF中不能再script中很好的訪問註冊表,那麼能夠寫一個ScriptPlugin使得能夠在script中使用QSettings,而後一切就都方便了,還不須要改寫QIF的源碼。開發
在 Qt 5 中把 Qt Script 和 Qt Script Tool 2個模塊,從模塊的列表中消失了,雖然依然保留在了 Qt 5 中,但重要性下降了很多。
從 Qt 5 的安裝目錄查看,Qt Script 和 Qt Script Tool 依然是以獨立dll的形式提供,但經過源碼對比能夠發現,2個工程的代碼都沒有太大的變化,只有一些重構方面的工做,從api目錄的頭文件能夠看出,除了移除了 QT_MODULE 宏,幾乎沒有任何更改。get
Qt Quick1 是一個集合,用於在各類移動設備上建立交互界面。設計的目的是爲了是UI設計師和開發人員能夠更緊密的工做。源碼
其中包含了用戶界面元素、一種描述交互界面的語言(QML)、QML語言的Runtime(Qt Declarative 模塊)
QML 在語法上遵照 JavaScript 的語法,並進行了 Qt 必須的擴展。
Qt Declarative 模塊提供了一個動態框架用來構建動態的交互界面,爲 QML 提供運行環境;解決了 C++ 和 QML 的交互問題。
Qt Quick2 提供了5個 Qt模塊 做爲開發 QML 程序的框架,包括 Qt QML, Qt Quick, Qt Quick Controls, Qt Quick Dialogs, Qt Quick Layouts 共5個模塊。相比於 Qt 4.8 時的一個模塊,算是最直觀的改變了。
從 Qt 5 開始,提供了 qml 程序。這使得 QML 的程序再也不必須從 C++ 代碼啓動,而能夠做爲一個獨立的腳本程序運行。
目前已是 Qt 5 的時代,但根據以前 Qt 3 的經驗, Qt 4 還將繼續存在很長的時間。
在 Qt 5 中 QtScript 被降級; Declarative 模塊被2個 QML 模塊取代; Quick1 除了支撐舊的 QML 腳本外,幾乎沒有什麼用途了; Quick2 和 QML 在將來的 Qt 版本中會獲得越來愈多的重視,在 Qt 5 中 Quick2 添加了不少有意思的功能,還須要繼續深刻的學習。
那麼 QtScript 和 QML 有沒有關係呢?
首先2者沒有直接關係,都是腳本。
QtScript 聽從 ECMAScript 的標準
QML 是 Qt 本身定義的語法,相似 JSON
QML 設計本意是爲了使用 動態語言 編寫交互界面
QtScript 設計本意是爲了使得 動態語言 業務邏輯部分,固然也能夠是部分界面層次的邏輯。
經過寫這篇文章,我終於理清了 QtScript, QML, Quick1, Quick2, Declarative 之間的關係。但願看文章的你也清楚了。