在 C++ 中使用QML对象

原创 2016年08月30日 15:16:55
看过了如何在 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则是你的最佳选择。




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









相关文章推荐

C++与QML交互1:在C++中调用QML对象

一、C++中调用QML对象 所有的QML对象类型,包括QML引擎内部实现或者实现第三方库,都是QObject子类,都允许QML引擎使用Qt元对象系统动态实例化任何QML对象类型。 在启动QML时,会...

将C++对象暴露给QML

简述QML 可以很容易地通过 C++ 代码中定义的功能进行扩展。由于 QML 引擎与 Qt 元对象系统的紧密集成,QObject 派生类适当暴露的任何功能都可以从 QML 代码访问,这使得 C++ 中...

在C++中与QML对象交互

所有的 QML 对象类型 - 无论由引擎内部实现还是由第三方源定义,都是 QObject 派生的类型。这意味着,QML 引擎可以使用 Qt 元对象系统动态实例化任何 QML 对象类型并检查创建的对象。...

将C++对象嵌入到带有上下文属性的QML中

当加载一个 QML 对象到一个 C++ 应用程序中时,直接嵌入可以从 QML 代码中使用的一些 C++ 数据是非常有用的。例如,对嵌入的对象调用一个 C++ 函数,或者使用一个 C++ 对象实例作为 ...

qml中注册和使用C++对象,以及在qml中实现窗体最大最小化

在main函数中相关代码如下: QApplication app(argc, argv); QDeclarativeView view ; //将app注册到qml中...

C++程序中使用QML绑定机制

原文地址:http://doc.qt.digia.com/4.7-snapshot/qtbinding.html QML被定为一种可容易使用C++扩展,并可扩展C++的语言.使用Qt Declara...
  • henreash
  • henreash
  • 2012年09月18日 13:29
  • 12378

单例模式的简单使用(QML调用C++)

这里举一个QML调用C++的例子: 1、头文件  2、源文件 3、调用 4、QML引用 其实,在QML中调用图片并不用这么麻烦的事情,上面是为了讲...

Python和C++混合使用QML开发GUI

pyqt和qml结合的中文资很少,在baidu上搜索,基本上就是浪费时间。在国外的blog上,有零星的几篇,但是介绍好的少。在stackoverflow上看到一篇关于pyside,发现pyside,发...
  • Esonpo
  • Esonpo
  • 2014年07月01日 09:48
  • 2879

QML与C++混合编程使用

 http://dxwang.blog.51cto.com/384651/875541 本文适合于对Qt Quick有基本了解的读者。首先回答一个比较常会被问到的问题:什么是Q...

详解QML与C++混合编程使用

http://mobile.51cto.com/symbian-272828.htm   Qt Quick是Qt User Interface Creation Kit的缩写,而QML是Qt Qu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在 C++ 中使用QML对象
举报原因:
原因补充:

(最多只允许输入30个字)