C++與QML進(jìn)行數(shù)據(jù)交互實(shí)現(xiàn)方式介紹
我所使用的方式,是通過C++調(diào)用遠(yuǎn)端的webservice,再次數(shù)據(jù)送到qml端,不說原理了,直接上代碼的實(shí)現(xiàn)過程。需要明白一點(diǎn):qml不接受QList的類方式,所以使用了QList<QObject*>。大致分為四步,按需要看:
一、定義可交互的類
可以IDE生成中選擇基類為QObject完成即可,基本代碼自動(dòng)生成。
h:
#ifndef TEST_H #define TEST_H #include <QObject> class test : public QObject { Q_OBJECT public: explicit test(QObject *parent = nullptr); signals: public slots: }; #endif // TEST_H
cpp:
#include "test.h" test::test(QObject *parent) : QObject(parent) { }
以上文件中,最重要的兩點(diǎn):繼承自QObject以及包含Q_OBJECT均完成。
定義屬性時(shí),需要寫在Q_OBJECT下面,沒有分號,可以使用快捷鍵對相關(guān)的代碼進(jìn)行自動(dòng)生成,演示一個(gè)字段屬性,完成后的代碼如下,字段名為name:
#ifndef TEST_H #define TEST_H #include <QObject> class test : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName) public: explicit test(QObject *parent = nullptr); QString name() const { return m_name; } signals: public slots: void setName(QString name) { m_name = name; } private: QString m_name; }; #endif // TEST_H
在自動(dòng)生成數(shù)據(jù)時(shí),最好先寫入一個(gè)private節(jié),這個(gè)自動(dòng)生成的時(shí)候沒有,定義后,使用的私有變量會(huì)放在這里,否則會(huì)跟在public slots下,反正是最下面了。
二、數(shù)據(jù)操作類
數(shù)據(jù)操作類的生成方法與上步類似,不同的是需要定義操作的方法,以返回?cái)?shù)據(jù)的為數(shù)據(jù)集為例,在public中定義一個(gè)方法,類名定義為c_test:
Q_INVOKABLE QList<QObject*> getData() const;
如果返回的只是一個(gè)單值,則這樣:
Q_INVOKABLE QString getData() const;
賦值:
QList<QObject*> c_test::getData() const { QList<QObject*> r_list; ... test *t1 = new test; t1.setName("..."); r_list.append(t1); ... return r_list; }
三、注冊
注冊是指將C++的類注冊到qml中供調(diào)用,貌似有兩種方式,我使用的是setContextProperty。在main中,connect前:
engine.rootContext()->setContextProperty("c_test", new c_test);
經(jīng)測試,在1中所定義的類,不需要注冊。
四、qml調(diào)用
將值給ListMode時(shí),需要進(jìn)行一次迭代。
var data = c_test.getData() _model.clear() for(var i=0;i<data.length;i++){ _model.append(data[i]); }
如上代碼中的c_test.getData()就是使用注冊的類進(jìn)行的操作。
此處迭代是必須的,不能直接給model。
在qml中顯示:
Text{
text: name
}
這里所使用的name,就是在一的類里所定義的屬性。
這個(gè)一直做為攔路虎的東西,在實(shí)現(xiàn)后發(fā)現(xiàn)也并不是很麻煩。以上方式測試通過,熟練了一種之后,如果需要可以再看其它,應(yīng)該就簡單了吧。
到此這篇關(guān)于C++與QML進(jìn)行數(shù)據(jù)交互實(shí)現(xiàn)方式介紹的文章就介紹到這了,更多相關(guān)C++與QML數(shù)據(jù)交互內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(104.二叉樹的最大深度)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(104.二叉樹的最大深度),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Objective-C的內(nèi)省(Introspection)用法小結(jié)
這篇文章主要介紹了Objective-C的內(nèi)省(Introspection)用法,這是面向?qū)ο笳Z言和環(huán)境的一個(gè)強(qiáng)大特性,需要的朋友可以參考下2014-07-07C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法
這篇文章主要介紹了C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法,需要的朋友可以參考下2014-07-07C語言+shell實(shí)現(xiàn)linux網(wǎng)卡狀態(tài)檢測
這篇文章主要為大家詳細(xì)介紹了C語言+shell實(shí)現(xiàn)linux網(wǎng)卡狀態(tài)檢測,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06利用C語言實(shí)現(xiàn)一個(gè)最簡單的飛機(jī)游戲
在前面彈跳小球?的基礎(chǔ)上實(shí)現(xiàn)一個(gè)簡單的飛機(jī)游戲,主要包括飛機(jī)的顯示、控制移動(dòng)、顯示復(fù)雜圖案、發(fā)射激光、打靶練習(xí)等功能,感興趣的可以嘗試一下2022-10-10Linux?C/C++?timeout命令實(shí)現(xiàn)運(yùn)行具有時(shí)間限制功能
inux?timeout命令的一個(gè)屬性是時(shí)間限制??梢詾槿魏蚊钤O(shè)置時(shí)間限制。如果時(shí)間到期,命令將停止執(zhí)行,這篇文章主要介紹了Linux?C/C++?timeout命令實(shí)現(xiàn)(運(yùn)行具有時(shí)間限制),需要的朋友可以參考下2023-02-02C++基于蔡基姆拉爾森計(jì)算公式實(shí)現(xiàn)由年月日確定周幾的方法示例
這篇文章主要介紹了C++基于蔡基姆拉爾森計(jì)算公式實(shí)現(xiàn)由年月日確定周幾的方法,涉及C++針對日期時(shí)間的數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07