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