日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++與QML進行數據交互實現方式介紹_C 語言

作者:wjhx ? 更新時間: 2022-11-04 編程語言

我所使用的方式,是通過C++調用遠端的webservice,再次數據送到qml端,不說原理了,直接上代碼的實現過程。需要明白一點:qml不接受QList的類方式,所以使用了QList<QObject*>。大致分為四步,按需要看:

一、定義可交互的類

可以IDE生成中選擇基類為QObject完成即可,基本代碼自動生成。

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)
{
}

以上文件中,最重要的兩點:繼承自QObject以及包含Q_OBJECT均完成。

定義屬性時,需要寫在Q_OBJECT下面,沒有分號,可以使用快捷鍵對相關的代碼進行自動生成,演示一個字段屬性,完成后的代碼如下,字段名為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

在自動生成數據時,最好先寫入一個private節,這個自動生成的時候沒有,定義后,使用的私有變量會放在這里,否則會跟在public slots下,反正是最下面了。

二、數據操作類

數據操作類的生成方法與上步類似,不同的是需要定義操作的方法,以返回數據的為數據集為例,在public中定義一個方法,類名定義為c_test:

Q_INVOKABLE QList<QObject*> getData() const;

如果返回的只是一個單值,則這樣:

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中供調用,貌似有兩種方式,我使用的是setContextProperty。在main中,connect前:

engine.rootContext()->setContextProperty("c_test", new c_test);

經測試,在1中所定義的類,不需要注冊。

四、qml調用

將值給ListMode時,需要進行一次迭代。

var data = c_test.getData()
_model.clear()
for(var i=0;i<data.length;i++){
	_model.append(data[i]);
}

如上代碼中的c_test.getData()就是使用注冊的類進行的操作。

此處迭代是必須的,不能直接給model。

在qml中顯示:

Text{
?? ?text: name
?? ?}

這里所使用的name,就是在一的類里所定義的屬性。

這個一直做為攔路虎的東西,在實現后發現也并不是很麻煩。以上方式測試通過,熟練了一種之后,如果需要可以再看其它,應該就簡單了吧。

原文鏈接:https://blog.csdn.net/wjhx/article/details/126708542

欄目分類
最近更新