如何選擇C++與QML交互的兩種方式?

一直採用Qt Widgets寫界面和邏輯,Qt Quick出來這麼久了,現在想重新開始學習下這種開發模式,畢竟是Qt以後的發展趨勢和Digia主推的思路,即:QML負責前端界面,C++負責後端邏輯。

Qt Quick提供了兩種方式:1.註冊類到qml:qmlRegisterType;2.暴露C++對象的方式:setContextProperty。

我想問,這兩種方式如何選擇,哪個可維護性更好?請有多年Qt開發經驗的朋友解答下,謝謝。


QML 與 C++ 交互大體就這兩種

qmlRegisterType 是註冊類型,針對復用組件

setContextProperty 是將對象暴露給 QML,一般默認就是全局單例。

就維護性上來說,setContextProperty 應該要用 qmlRegisterSingletonType 來代替,但是不排除一個應用有多個 QmlEngine 實例,使用 qmlRegisterSingletonType 是引擎單例,(當然取決於你如何實現的)。這個要作區分。

另外 QML 與 C++ 交互可不止這兩種呢。

1. QML 與 C++ 的數據交互

2. QML 調用 C++ 對象方法

a. 全局單例

b. 註冊新類型到 QM

3. C++ 調用 QML 對象方法

a. 將 qml 對象的 id 以 QObject* 的方式進行傳參

b. 在 C++ 代碼中主動捕獲 qml 對象

原貼在這裡 Qt 在線技術交流之C++ 與 QML 交互

可以看看這個我錄製的視頻 C++ 與 QML 的交♂互♀

另外這些文章希望可以給你一些幫助 QtQuick 進階


我是從去年開始用qml。

1年多了。

不算久,所以歡迎大家指教,討論吧。

姑且說下我的理解。

其實兩個區別主要就是這東西是要在哪邊創建。

qmlRegisterType註冊的是類型,讓qml可以識別你定義的是什麼東西。

setContextProperty傳遞的是對象,就是把創建好的東西放到qml的運行環境下,然後在運行中可以用。

舉個例子,我自己的項目。

1,用c++寫的控制項(繼承自QQuickItem),是用的qmlRegisterType註冊進去,然後在qml里創建,並使用。

2,然後viewmodel(架構是仿mvvm模型)都是由一個共同的對象持有,然後用setContextProperty把這個對象註冊進去。在qml直接調用方法,屬性。


如果你註冊了C++類到QML中,當代碼在C++層面執行時,可以通過發送信號的方式,在QML層面接收信號及使用信號傳遞過來的參數;當代碼在QML層面執行時,可以調用C++對象的方法。簡單說,C++中發送信號,QML中響應;QML直接調用C++對象的方法。


1.註冊類到qml:qmlRegisterType;

這樣的方式可以註冊一個類類型到QML域,開發者可以在QML域中的任意位置使用這個類創建對象。這個對象在QML中的可見性,限於創建這個對象的文件。

2.暴露C++對象的方式:setContextProperty。

這樣的方式可以註冊一個類對象到QML域,相當於在QML域中定義了一個全局對象,開發者可以在QML域中的任意位置使用這個對象。


推薦閱讀:

QT溫度計折線圖如何實現?
如何閱讀Telegram(Desktop)的源代碼?
為什麼 Qt 框架不是很流行?
哪裡有QT項目視頻教程下載?
qt中界面美化使用QSS的話有什麼好的模板或者開源網站提供qss文件?

TAG:QtC開發框架 | QtQuick |