QT之QML与C++混合编程
来源:互联网 发布:mac上的安卓模拟器 编辑:程序博客网 时间:2024/06/06 04:13
使用qml文件我们能够快速构建UI界面,大大减少了C++代码编写界面的难度,但一些底层的编程还是需要使用C++来完成,这时我们就需要QML与C++混合编程了,一般就是使用QML 快速构建界面, C++ 实现非界面的业务逻辑和复杂运算。
QML的基本类型比如Item,实际上在C++中的实现就是QQuickItem,这意味着QML中是可以使用C++类和对象的,而C++也是可以识别qml构建的对象并控制它的。
QML中使用C++类型
QML 其实是对 JavaScript 的扩展,融合了 Qt Object 系统,它是一种新的解释型的语言。
Qt 提供了两种在 QML 环境中使用 C++ 对象的方式:
- 在 C++ 中实现一个类,注册到 QML 环境中, 在QML 中使用该类型创建对象
- 在 C++ 中构造一个对象,将这个对象设置为 QML 的上下文属性,在 QML 中直接使用该对象
下面我们主要讲解第一种方法,从C++中导出类为QML所用,可分为四个步骤:
- 实现 C++ 类
- 注册 QML 类型
- 在 QML 中导入类型
- 在 QML 创建由 C++ 导出的类型的实例并使用
实现C++类
要想将一个类或对象导出到 QML 中,必须满足下列条件:、
- 从 QObject 或 QObject 的派生类继承
- 使用 Q_OBJECT 宏
这两个条件是为了让一个类能够使用 Qt 强大的元对象系统(meta-object system)中,只有使用元对象系统,一个类的某些方法或属性才可能通过字符串形式的名字来调用,才具有了在 QML 中访问的基础条件。
下面以一个实际例子来进行说明:
首先我们创建一个Qt quick工程,创建两文件.h和.cpp,在.h中进行类的声明,.cpp中是类的实现。
这个类我们命名为ColorPicker,意为颜色选择器
信号signals和槽slots在QML中是可以直接使用的,此外还有一些导出宏定义
- G_ENUMS用来导出枚举类型,在QML中以
CLASSNAME. {ENUM_VALUE}的方式使用 - Q_INVOKABLE 用来导出方法,在QML中以
Object. {method}的方式调用 - Q_PROPERTY用来导出属性,在QML中以
Object. {propert}的方式访问
Q_PROPERTY宏定义比较复杂,拿出来说一下
Q_PROPERTY(type name (READ getFunction [WRITE setFunction] | MEMBER memberName [(READ getFunction | WRITE setFunction)]) [RESET resetFunction] [NOTIFY notifySignal] [REVISION int] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool] [CONSTANT] [FINAL] )
可选项很多,但一般使用到的就是读函数READ,写函数WRITE,通知信号函数NOTIFY
注册 QML 类型
注册QML类型可使用qmlRegisterType
template<typename T> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);
在 QML 中导入类型
这个就比较简单了,和使用import QtQuick 2.0一样,你在注册时给定了一个模块名和版本号,所以导入格式如下
import module x.x
在 QML 创建由 C++ 导出的类型的实例并使用
这个更不用说了,你会创建Rectangle的实例吧,同样你这样创建你自己导出类型的实例,设置它的属性,编写信号处理器就OK了
C++中控制QML
- QT之QML与C++混合编程
- Qt Quick 之 QML 与 C++ 混合编程详解
- Qt Quick 之 QML 与 C++ 混合编程详解
- Qt Quick 之 QML 与 C++ 混合编程详解
- Qt c++与QML混合编程
- Qt:QML与C++混合编程详解
- QML, Qt C++混合编程
- QML, Qt C++混合编程--QML与Qt C++ 交互机制探讨与总结
- QML与C++混合编程
- QML与c++混合编程
- QML与C++混合编程
- qml与c++混合编程之简单demo说明
- qml与c++混合编程之简单demo说明
- Qt(C++)与Matlab混合编程
- Qt for iOS,Qt 与Objective C混合编程
- Qt for iOS,Qt 与Objective C混合编程
- Qt for iOS,Qt 与Objective C混合编程
- Qt for iOS,Qt 与Objective C混合编程
- JAVA实现canny算法进行单像素边缘检测(图像处理)
- UnityShader入门精要学习笔记(二十一):深度和法线纹理
- OI模板·快速幂
- java删除文件和文件夹具体实现
- 一个通用的Java正则匹配工具(检查邮箱名、电话号码、用户密码、邮政编码等合法性的工具类)
- QT之QML与C++混合编程
- Python远程执行Linux命令
- python的Django框架应用(2)
- iTOP4412 安装NFS服务器
- Android Wi-Fi 四次握手简介
- 大数据和空间限制问题
- [LintCode]372.在O(1)时间复杂度删除链表节点
- Yocto 支持从sysvinit 到 systemd
- Bookshelf 2 -- 动态规划01背包稍作改变