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

目录
  • 一、定义可交互的类
  • 二、数据操作类
  • 三、注册
  • 四、qml调用

我所使用的方式,是通过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数据交互内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • QML与C++交互的实现步骤

    目录 前言 第一个例子:QML中创建C++对象 第二个例子:C++中加载QML对象 参考 前言 文档如是说,QML旨在通过C ++代码轻松扩展.Qt QML模块中的类使QML对象能够从C ++加载和操作,QML引擎与Qt元对象系统集成的本质使得C ++功能可以直接从QML调用.这允许开发混合应用程序,这些应用程序是通过混合使用QML,JavaScript和C ++代码实现的. QML is designed to be easily extensible through C++ code. Th

  • 将 C++ 类型属性暴露给 QML

    目录 一.数据类型处理和所有权 1.1.暴露属性 1.2.使用通知信号的注意事项 1.3.具有对象类型的属性 1.4.具有对象列表类型的属性 1.5.分组属性 二.暴露方法 三.暴露信号 可以使用 C++ 代码中定义的功能轻松扩展 QML.由于 QML 引擎与 Qt 元对象系统的紧密集成,QObject 派生类公开的任何功能都可以从 QML 代码访问.这使得 C++ 数据和函数可以直接从 QML 访问,通常几乎不需要修改. QML 引擎能够通过元对象系统反射 QObject 实例.这意味着任何

  • 利用上下文属性将 C++ 对象嵌入 QML 里

    目录 一.设置简单的上下文属性 二.将对象设置为上下文属性 三.上下文属性与C++ 的数据模型示例 3.1.字符串列表模型 3.2.对象列表模型 3.3.QAbstractItemModel QQmlContext 类使将 C++ 数据注入 QML 对象的能力成为可能.此类向 QML 对象的上下文公开数据,以便可以直接从 QML 代码范围内引用数据. 一.设置简单的上下文属性 例如,这里有一个 QML 项,它引用了当前作用域中不存在的 currentDateTime 值: // MyItem.q

  • C++数据模型应用在QML委托代理机制中

    目录 定义数据模型 定义图片缓存器 初始化QML引擎 QML中访问C++数据模型 之前文章中介绍过在Qt-Widget和QML中如何使用委托代理机制(Model-View-Delegate),对应的文章链接分别如下所示: QT中Model-View-Delegate委托代理机制 QML基础 在开发的过程中发现在QML中直接定义操作数据模型比较繁琐费力,不如C++的数据模型好用.这里就介绍一下如何在QML中调用C++定义的数据模型,实现数据模型的混合使用. 定义数据模型 定义的C++数据模型和Qt

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

    目录 一.定义可交互的类 二.数据操作类 三.注册 四.qml调用 我所使用的方式,是通过C++调用远端的webservice,再次数据送到qml端,不说原理了,直接上代码的实现过程.需要明白一点:qml不接受QList的类方式,所以使用了QList<QObject*>.大致分为四步,按需要看: 一.定义可交互的类 可以IDE生成中选择基类为QObject完成即可,基本代码自动生成. h: #ifndef TEST_H #define TEST_H #include <QObject&g

  • JSON传递bool类型数据的处理方式介绍

    ajax中使用json传递数据时,其它数据类型都不是问题,但是如果服务器端生成的JSON中有bool类型的数据时,到客户端解析时出现了小小的问题,总结如下: 服务器返回的JSON为: 复制代码 代码如下: {"TypeID":[1037],"Title":"河北软件职业技术学院","Intro":"","IsLink":"false","LinkUrl&qu

  • 多种方式实现JS调用后台方法进行数据交互

    项目开发过程中很多地方都需要前端和后台的数据交互,几种典型常用的方法如利用控件的AutopostBack属性.Button提交表单等等.但这些都是有条件的,AutoPostBack具有实时性但会刷新页面,Button提交表单不能实现数据交互的实时性.当然说到前台与后台的数据交互更不能漏掉ajax,ajax实现前台与后台数据的异步交互,并且保证实时的.局部刷新.但有些数据不需要异步交互,例如当交互的数据是下一步执行的条件时,就必须要等到数据前台与后台数据交互完成后才能继续执行程序.所以对于掌握js

  • SpringBoot实现前后端、json数据交互以及Controller接收参数的几种常用方式

    目录 前言 获取参数的几种常用注解 一.请求路径参数get请求 二.Body参数POST请求 四.HttpServletRequest 五.参数校检 最终选择交互方式 参考文献 总结 前言 现在大多数互联网项目都是采用前后端分离的方式开发,前端人员负责页面展示和数据获取,后端负责业务逻辑处理和接口封装.当与前端交互的过程当中,常用json数据与前端进行交互,这样想取出前端传送过来的json数据的时候,就需要用到@RequestBody这个注解.@RequestBody注解用于读取http请求的内

  • 常用的Spring Boot调用外部接口方式实现数据交互

    目录 springboot调用外部接口常用的方式 1.使用原始httpClient请求 2.使用RestTemplate请求 1.get请求 2.post请求 3.使用Feign请求 4.小结 springboot调用外部接口常用的方式 在系统开发过程中,免不了要去调用第三方接口,springboot为我们提供了几种调用第三方接口的方法 1.使用原始httpClient请求 <dependency> <groupId>org.apache.httpcomponents</gr

  • ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据的传递

    前言 最近公司项目进行架构调整,由原来的三层架构改进升级到微服务架构(准确的说是服务化,还没完全做到微的程度,颗粒度没那么细),遵循RESTFull规范,使前后端完全分离,实现大前端思想.由于是初次尝试,中途也遇到了不少问题.今天就来讨论一下其中之一的问题,WebAPI与前端Ajax 进行跨域数据交互时,由于都在不同的二级域名下(一级域名相同),导致Cookies数据无法获取. 最开始通过头部(Header)将Cookies传输到其WebAPI,也能解决问题. 下面讲述另外一种解决方案. 解决过

  • Ajax+php数据交互并且局部刷新页面的实现详解

    什么是Ajax? 国内翻译常为"阿贾克斯"和阿贾克斯足球队同音,AJAX 是一种用于创建快速动态网页的技术,他不是新语言,而是一种使用现有标准的新方法.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新,这样就可以在不重新加载整个网页的情况下,对网页的某部分进行更新. XMLHttpRequest 是 AJAX 的基础,用于和服务器交换数据.所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject) 下面这篇文章主

  • SpringMVC前端和后端数据交互总结

    本文主要介绍了SpringMVC前端和后端数据交互的资料,特地发出来记录一下.有需要的朋友可以了解一下. 控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是servlet的替代品. 传值方式 springmvc最方便的一点就是可以通过注释方式来定义它的url. @Controller public class formMVC { @RequestMapp

  • 微信小程序 数据交互与渲染实例详解

    微信小程序 数据交互与渲染 实现效果图: 微信小程序的api中提供了网络交互的api,我们只要调用即可和后端进行数据交互,该api为wx.request.,具体代码如下. //list.js //获取应用实例 var app = getApp() Page({ data: { list:[], hiddenLoading: true, url: '' }, loadList: function () { var that = this; that.setData({ hiddenLoading:

随机推荐