【无标题】qml与c++数据交互的一种方式

迫于无奈开始写android的程序,以前使用QWidget的方式试过,虽然界面可以实现,但是最后调用摄像头时,未能成功,再没有继续。这几天开始使用qml进行尝试,在使用的过程中,其中的一个难点,就是在qml与c++中数据的交互。

我所使用的方式,是通过C++调用远端的webservice,再次数据送到qml端,不说原理了,直接上代码的实现过程。需要明白一点:qml不接受QList的类方式,所以使用了QList<QObject*>。大致分为四步,按需要看:

一、定义可交互的类,可以IDE生成中选择基类为QObject完成即可,基本代码自动生成。

image-20220905155941061

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:

image-20220905160919877

#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,就是在一的类里所定义的属性。

这个一直做为拦路虎的东西,在实现后发现也并不是很麻烦。以上方式测试通过,熟练了一种之后,如果需要可以再看其它,应该就简单了吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在QMLC++之间有多种交互方式一种方式是通过信号和槽机制进行交互。在QML中,可以通过定义信号来触发C++中的槽函数,然后在C++中通过信号来调用QML中的槽函数。这种方式可以实现双向的交互。\[2\]另一种方式是通过QVariant类型进行交互。QVariant是Qt中的一个通用数据类型,可以在QMLC++之间传递数据。在C++中,可以使用QVariant的canConvert和convert方法来判断和转换数据类型。\[2\]还有一种方式是通过在QML中调用C++模块的方法。在QML中,可以使用QtqmlRegisterType函数将C++模块注册为一个可用的类型,然后在QML中直接调用C++模块的方法。这种方式适用于QML界面需要调用C++模块的业务逻辑的情况。\[1\]以上是QMLC++交互方式的简要介绍。具体的实现可以参考相关的文档和示例代码。 #### 引用[.reference_title] - *1* [QML进阶(八)实现QML界面与C++类型交互](https://blog.csdn.net/yang1fei2/article/details/124650902)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C++QML交互总结](https://blog.csdn.net/hsy12342611/article/details/122910060)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值