在 C++ 中使用QML对象

来源:互联网 发布:沈阳化工大学淘宝地址 编辑:程序博客网 时间:2024/06/05 17:56
看过了如何在 QML 中使用 C++ 类型或对象,现在来看如何在 C++ 中使用 QML 对象。
    我们可以使用 QML 对象的信号、槽,访问它们的属性,都没有问题,因为很多 QML 对象对应的类型,原本就是 C++ 类型,比如 Image 对应 QQuickImage , Text 对应 QQuickText……但是,这些与 QML 类型对应的 C++ 类型都是私有的,你写的 C++ 代码也不能直接访问。肿么办?

    Qt 最核心的一个基础特性,就是元对象系统,通过元对象系统,你可以查询 QObject 的某个派生类的类名、有哪些信号、槽、属性、可调用方法等等信息,然后也可以使用 QMetaObject::invokeMethod() 调用 QObject 的某个注册到元对象系统中的方法。而对于使用 Q_PROPERTY 定义的属性,可以使用 QObject 的 property() 方法访问属性,如果该属性定义了 WRITE 方法,还可以使用 setProperty() 修改属性。所以只要我们找到 QML 环境中的某个对象,就可以通过元对象系统来访问它的属性、信号、槽等。


使用元对象调用一个对象的方法

    QMetaObject 的 invokeMethod() 方法用来调用一个对象的信号、槽、可调用方法。它是个静态方法,。假设一个对象有这么一个槽 compute(QString, int, double) ,返回一个 QString 对象,那么你可以这么调用(同步方式):
QString retVal;
QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection,
                          Q_RETURN_ARG(QString, retVal),
                          Q_ARG(QString, "sqrt"),
                          Q_ARG(int, 42),
                          Q_ARG(double, 9.7));



QML与现有Qt UI代码的整合
如果你已经有了一个基于QWidget的UI,QML widgets可以使用QDeclarativeView来进行集成。QDeclarativeView是QWidget的一个子类,所以你可以像加载其他QWidget一样把它加载进你的UI。 具体方法是使用QDeclarativeView::setSource()方法加载一个QML文件到视图中,然后将这个视图(即QDeclarativeView)加到你的UI中。


请注意,QWidgets的UI设计理念与QML并不相同,所以将基于QWidget的应用移植到QML并不总是一个好主意。
如果你的UI是由少数几个复杂、静态的元素的组成,使用QWidgets是一个更好的选择;
而如果你的UI是由大量简单、动态的元素组成,那么QML则是你的最佳选择。

Introduction to Qt Quick for C++ Developers



    在Qt5,所有QML应用呈现一个OpenGL场景图的架构,而不是在Qt4使用的图形视图框架。由于这种建筑的变化规模,在Ç++ API已经被广泛的重组和的QtDeclarative模块已被弃用换为成两个新模块:Qt QML,它实现的QML引擎和语言的基础设施,和Qt Quick,它实现了视觉帆布和场景图的后端。
    以前在QtDeclarative模块的所有类都已经放入了Qt QML和Qt Quick的模块,他们的类的名称已被更改,以反映其新的模块位置。类名的变化如下:








0 0