QtQuick 系列教程之 QML 与 C++ 交互
QML 作为一种灵活高效的界面开发语言已经越来越得到业界的认可。QML 负责界面,C++ 负责逻辑,这也是 Qt 官方推荐的开发方式。那么 QML 与 C++ 的交互必然是需要我们掌握并且精通的。
本文将详细介绍 QML 与 C++ 的几种交互方式,以及在项目中的实际应用方法。通过实际的例子来实现,体验并且应用这几种交互方式,为我们后续的产品开发提供便利。
将分 4 大部分讲解:
- C++ 对象注册到 QML,QML 访问 C++ 对象;
- QML 暴露对象给 C++ 进行交互;
- C++ 创建 QML 对象并进行交互;
- C++ 对象与 QML 通过信号槽交互。
通过本 Chat 的阅读和交流,您将了解熟悉 QML 与 C++ 的交互方式,并且从中获得改造提升自身项目代码结构或者获得交互上的解惑顺利完成项目。
目录:
方式1:C++ 对象注册到元对象系统
QQmlApplicationEngine::rootContext()->setContextProperty()
方式2:C++ 对象注册到Qml系统
qmlRegisterType()
qmlRegisterSingletonType()
方式3:C++ 创建/获取Qml对象
QQmlComponent::create()QQmlApplicationEngine::rootObjects()[0]->findChild<QObject*>()
本博文技术等级: ★★☆☆☆☆☆☆☆☆Qml 与 C++ 间的数据类型((http://gitbook.cn/books/5acf2d97573c31562789c16a/index.html#title12))
系列文章总目录传送(https://blog.csdn.net/zhengtianzuo06/article/details/79796798)
方式1 :C++ 对象注册到元对象系统
首先我们新建一个工程。
刚创建好就是这样的,不会创建的读者可以翻看我前几篇教程。
然后我们新建一个 C++ 的类,然后就可以通过 C++ 的类和 main.qml 这界面进行交互了。
首先,右键工程,选择添加新文件...
选择 C++ Class
类名我们就随便写一个,QmlCpp。下面 Base class 基类我们选择 QObject,Include QObject 会被自动勾上。然后填写头文件名,源文件名。
这样就成功的添加了一个 C++ 的类进来。
下面重点来了, 我们对当前的 C++ 类进行改造,增加两个函数, 一个函数用来保存整型,一个函数用来读取整型。
细心的读者应该发现了函数定义的前面多了一个 Q_INVOKABLE。
我们来看看官网是怎么描述的: Q_INVOKABLE(http://doc.qt.io/qt-5/qobject.html#Q_INVOKABLE)
从第一句可以看出来,这个宏是将函数申明为元对象系统可调用的函数。QtQuick 也在元对象系统内,所以也就可以访问这个函数了。
接下来我们继续实现:
这里有偷懒的办法,头文件里写好函数后,直接调用重构的功能,自动生成函数的实现结构。
是不是很方便,然后在头文件里添加一个整型成员变量。
然后我们直接在函数中添加我们的实现代码:
C++ 类的代码就写的差不多了,接下来我们需要将这个 C++ 类注册到 Qml 中。
打开 main.cpp:
在 Qml 引擎实例的下面,添加代码:
这时候我们会发现 Qml 引擎的上下文没法显示出方法,原来是没有 include,我们添加一下:
接着我们继续注册:
可以看出来, 这里需要填写注册的名称和对象指针。
我们将 QmlCpp 的头文件引用进来,然后定义一个 QmlCpp 类的实例,调用设置整型的函数,并将这个 C++ 实例注册到 Qml 引擎上下文中标示为 “QmlCpp” 的名字, 这样 Qml 中就可以通过 QmlCpp 来访问这个 C++ 实例。
下面我们来改造 Qml 代码
Qml 中添加一个 button,按下事件添加代码 QmlCpp.getValue(); 通过这个代码来获取 C++ 实例中那个被保存的整型数据。
- CentOS 6 使用 yum 安装MongoDB及服务器端配置
- java处理高并发高负载类网站的优化方法
- 每一个程序员需要了解的10个Linux命令
- php_curl.dll libssh2.dll 始终无法加载的原因 及解决办法
- ant安装、环境变量配置及验证
- MySQL性能优化的最佳20+条经验
- 剑指offer面试题7——用两个栈实现队列
- String类中你不知道的知识
- Hibernate 不同数据库的连接及SQL方言
- Java中被你忽视的四种引用
- 使用Python和R语言从头开始理解和编写神经网络
- 深度学习中训练参数的调节技巧
- 大型网站技术架构!
- 理解js中的原型链,prototype与__proto__的关系
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python3异步爬虫 ——aiohttp模板使用
- [PHP] 抽象工厂设计模式-创建型设计模式
- [javascript] 支付宝小程序网络GET请求
- [PHP] 生成器模式-创建型设计模式
- [PHP] 工厂方法设计模式-创建型设计模式
- [PHP] 对象池模式-创建型设计模式
- [PHP] 原型模式-创建型设计模式
- [PHP] 简单工厂模式-创建型设计模式
- [PHP] 单例模式-创建型设计模式
- [PHP] 静态工厂模式-创建型设计模式
- [PHP] 适配器模式-结构型设计模式
- [PHP] 使用curl扩展POST或者PUT时数据不全和连接中断的排查
- [PHP] 桥接模式-结构型设计模式
- [PHP] 组合模式-结构型设计模式
- [GO-FLY] GO-FLY客服实现浏览器消息提示音