QT QML与C++混搭
“那些杀不死我的必使我更加强大”----尼采
QML与C++混合编程就是使用QML高效便捷地构建UI,而C++则用来实现业务逻辑和复杂算法。
ML访问C++
Qt集成了QML引擎和Qt元对象系统,使得QML很容易从C++中得到扩展,在一定的条件下,QML就可以访问QObject派生类的成员,例如信号、槽函数、枚举类型、属性、成员函数等。
QML访问C++有两个方法:一是在Qt元对象系统中注册C++类,在QML中实例化、访问;二是在C++中实例化并设置为QML上下文属性,在QML中直接使用。第一种方法可以使C++类在QML中作为一个数据类型,例如函数参数类型或属性类型,也可以使用其枚举类型、单例等,功能更强大。
C++类要想被QML访问,首先必须满足两个条件:
一是派生自QObject类或QObject类的子类
二是使用Q_OBJECT宏。
QObject类是所有Qt对象的基类,作为Qt对象模型的核心,提供了信号与槽机制等很多重要特性。这两个条件是为了让 一个 类 能够进入 Qt 强 大的 元 对象 系统( meta- object system), 只有 使用 元对象系统, 一个类的某些方法或属性才可能 通过字符串形式的名字 来 调用(??), 才具有了在QML中访问的基础条件。
Q_OBJECT宏必须在C++类的private区(C++默认为private)声明,用来声明信号与槽,使用Qt元对象系统提供的内容,位置一般在语句块首行。
一旦 你 导出 了 一个 类, 在 QML 中就 必然 要 访问 该类 的 实例 的 属性 或 方法 来 达到 某种 目的, C++类中 具有 什么 特征的 属性 或 方法 才可以被 QML 访问 呢?
(1) 信号、 槽
只要 是 信号 或者 槽, 都可 以在 QML 中 访问, 你 可以 把 C++ 对象 的 信号 连接 到 QML 中 定义 的 方法 上, 也可以 把 QML 对象 的 信号 连接 到 C++ 对象 的 槽 上, 还可以 直接 调用 C++ 对象 的 槽 或 信号…… 所以, 这是 最简单 好用 的 一种 途径。
(2) Q_ INVOKABLE 宏
在 定义 一个 类 的 成员 函数 时 使用 Q_ INVOKABLE 宏 来 修饰, 就可以 让 该 方法 被 元 对象 系统 调用。 这个 宏 必须 放在 返回 类型 前面。
程序例子:
构建Projects,选择Qt Quick Application。
需要注意的地方:
1) 在qml文件中使用C++对象的一个方法是,先生成一个对象,然后使用setContextProperty 函数将其注册到qml上下文中。这个生成的对象需要自己删除!
Ref:
http://blog.51cto.com/9291927/1975383