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语言中指针的知识,有需要学习此部分内容的朋友可以参考下
    2016-08-08
  • 详谈C++何时需要定义赋值/复制构造函数

    详谈C++何时需要定义赋值/复制构造函数

    下面小编就为大家带来一篇详谈C++何时需要定义赋值/复制构造函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C++实现LeetCode(201.数字范围位相与)

    C++实现LeetCode(201.数字范围位相与)

    这篇文章主要介绍了C++实现LeetCode(201.数字范围位相与),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言实现的顺序表功能完整实例

    C语言实现的顺序表功能完整实例

    这篇文章主要介绍了C语言实现的顺序表功能,结合完整实例形式分析了C语言顺序表的创建、添加、删除、排序、合并等相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • C++中的数据对齐示例详解

    C++中的数据对齐示例详解

    这篇文章主要介绍了C++中数据对齐的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • QT输入框输入限制整理(正则表达式限制)

    QT输入框输入限制整理(正则表达式限制)

    我们有时需要限制文本框输入内容的类型,下面这篇文章主要给大家介绍了关于QT输入框输入限制的相关资料,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-04-04
  • 利用Qt实现网络数据报文大小端数据的收发

    利用Qt实现网络数据报文大小端数据的收发

    大小端(Endianness)是计算机体系结构的一个术语,它描述了多字节数据在内存中的存储顺序,下面我们来看看如何利用Qt实现网络数据报文大小端数据的收发吧
    2024-11-11
  • C语言容易被忽视的函数设计原则基础

    C语言容易被忽视的函数设计原则基础

    C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.那么C语言函数设计的一般原则和技巧都是怎样的呢,下面带你了解
    2022-04-04
  • 详解C++17中if和switch语句的新特性

    详解C++17中if和switch语句的新特性

    这篇文章主要为大家详细介绍了C++17中if和switch语句的新特性的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C++中赋值初始化和直接初始化的区别

    C++中赋值初始化和直接初始化的区别

    赋值初始化和直接初始化虽然常常产生相同的结果,但在某些情况下它们有不同的含义和行为,本文主要介绍了C++中赋值初始化和直接初始化的区别,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04

最新评论