C++与QML进行数据交互实现方式介绍

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

我所使用的方式,是通过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,就是在一的类里所定义的属性。

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

到此这篇关于C++与QML进行数据交互实现方式介绍的文章就介绍到这了,更多相关C++与QML数据交互内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C/C++中线程基本概念与创建详解

    C/C++中线程基本概念与创建详解

    线程是在进程中产生的一个执行单元,是CPU调度和分配的最小单元,其在同一个进程中与其他线程并行运行,他们可以共享进程内的资源。本文就和大家一起聊聊线程基本概念以及如何创建多线程,需要的可以参考一下
    2022-09-09
  • C++实现AVL树的基本操作指南

    C++实现AVL树的基本操作指南

    AVL树是高度平衡的而二叉树,它的特点是AVL树中任何节点的两个子树的高度最大差别为1,下面这篇文章主要给大家介绍了关于C++实现AVL树的相关资料,需要的朋友可以参考下
    2022-01-01
  • C++实现模板方法模式的示例代码

    C++实现模板方法模式的示例代码

    这篇文章主要介绍了++实现模板方法模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • C++实现LeetCode(104.二叉树的最大深度)

    C++实现LeetCode(104.二叉树的最大深度)

    这篇文章主要介绍了C++实现LeetCode(104.二叉树的最大深度),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Objective-C的内省(Introspection)用法小结

    Objective-C的内省(Introspection)用法小结

    这篇文章主要介绍了Objective-C的内省(Introspection)用法,这是面向对象语言和环境的一个强大特性,需要的朋友可以参考下
    2014-07-07
  • C++操作MySQL大量数据插入效率低下的解决方法

    C++操作MySQL大量数据插入效率低下的解决方法

    这篇文章主要介绍了C++操作MySQL大量数据插入效率低下的解决方法,需要的朋友可以参考下
    2014-07-07
  • C语言+shell实现linux网卡状态检测

    C语言+shell实现linux网卡状态检测

    这篇文章主要为大家详细介绍了C语言+shell实现linux网卡状态检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 利用C语言实现一个最简单的飞机游戏

    利用C语言实现一个最简单的飞机游戏

    在前面弹跳小球 的基础上实现一个简单的飞机游戏,主要包括飞机的显示、控制移动、显示复杂图案、发射激光、打靶练习等功能,感兴趣的可以尝试一下
    2022-10-10
  • Linux C/C++ timeout命令实现运行具有时间限制功能

    Linux C/C++ timeout命令实现运行具有时间限制功能

    inux timeout命令的一个属性是时间限制。可以为任何命令设置时间限制。如果时间到期,命令将停止执行,这篇文章主要介绍了Linux C/C++ timeout命令实现(运行具有时间限制),需要的朋友可以参考下
    2023-02-02
  • C++基于蔡基姆拉尔森计算公式实现由年月日确定周几的方法示例

    C++基于蔡基姆拉尔森计算公式实现由年月日确定周几的方法示例

    这篇文章主要介绍了C++基于蔡基姆拉尔森计算公式实现由年月日确定周几的方法,涉及C++针对日期时间的数值运算相关操作技巧,需要的朋友可以参考下
    2017-07-07

最新评论