一.Qt Quick介绍
Qt Quick 是 QML 类型和功能的标准库,包括视觉类型、交互式类型、动画、模型和视图、粒子效果和着色效果
Qt Quick 使用 QML 作为声明语言,来设计以用户界面为中心的应用程序
QML 包含大量使用手机移动设备的功能模块,比如基本部件(QtQuick 模块)、GPS 定位、渲染特效、蓝牙、NFC、WebkKit 等等;
二.QML 介绍
QML 是一种用户界面规范和标记语言,允许开发人员和设计师创建高性能、流畅的动画和视觉吸引人的应用程序,像 C++ 一样,QML 是一种语言,文件格式以 .qml 结尾
QML 提供了一种高度可读、声明性、类似 JSON 的语法,支持与动态属性绑定相结合的命令式 JavaScript 表达式;
三.QML与C++混合编程
1.混合编程介绍
混合编程就是通过QML高效便捷的构建UI界面,而使用C ++来实现业务逻辑和复杂算法
Qt集成了QML引擎和Qt元对象系统,使得QML很容易从C ++中得到扩展;QML可以访问QObject派生类的成员如:信号 (signals),槽函数 (slots),枚举类型 (Q_ENUMS),属性 (Q_PROPERTY),成员函数 (Q_INVOKABLE );
2.QML调用C++
(1)方式一:
在C ++中实现一个派生自QObject的类,类中定义成员函数时使用Q_INVOKABLE宏来修饰;类中的属性或成员变量要用Q_PROPERTY 宏来修饰
在private区声明Q_OBJECT宏
使用qmlRegisterType()函数,将该类注册到QML环境中
QML环境中使用该类型创建QQmlApplicationEngine的对象,使C ++类在QML中作为一个数据类型,例如函数参数类型或属性类型,也可以使用其枚举类型、单例等,功能更强大
在QML上使用QQmlContext::setContextProperty(); 直接嵌入一些 C++ 数据或对象为上下文属性给QML使用
可以把 C++ 对象的信号连接到 QML 中定义的方法上,也可以把 QML 对象的信号连接到 C++ 对象的槽上,还可以直接调用 C++ 对象的槽或信号
(2)方式二:
在C ++中构造一个对象
将这个对象设置为QML的上下文属性
在QML环境中直接使用该属性
3.C++调用QML
在 C++ 中可以用QQmlComponent或QQuickView加载QML文件就可以访问QML对象了。QQuickView提供了一个显示用户界面的窗口,而QQmlComponent没有。
C++ 访问QML的属性:
先创建QQmlEngine 类型的引擎对象
创建QQmlComponent组合对象为引擎对象加载qml文件
调用QQmlComponent组合对象create()方法创建一个QObject对象
调用QObject的findChild()方法或findchildren()方法查询指定元素
调用QObject的property()和setProperty()方法动态获取或修改QML中元素的属性;
使用QQmlProperty::read()/write()来读取、修改height属性值
C++ 访问QML的函数和信号:
在C++中使用 QMetaObject::invokeMethod() 静态方法调用QML中的函数;
C++中使用 QObject::connect() 连接QML中的信号;