所有的QML对象类型,包括QML引擎内部实现或者实现第三方库,都是QObject子类,都允许QML引擎使用Qt元对象系统动态实例化任何QML对象类型。

在启动QML时,会初始化一个QQmlEngine作为QML引擎,然后使用QQmlComponent对象加载QML文档,QML引擎会提供一个默认的QQmlContext对象作为顶层执行的上下文,用来执行QML文档中定义的函数和表达式。

QQmlEngine::rootContext() 返回当前引擎QML的上下文,唯一的,QQmlContext* QQuickView::rootContext()
QQuickItem* QQuickView::rootObject() 返回当前QQuickView的根节点,也就是QML的根节点

1、使用C++加载QML对象

(1)使用QQmlComponent进行加载,读取QML文档,将转换成C++对象,进行赋值操作。

实例

1 QQmlEngine engine;                                                                                 //QML引擎
2 QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml"))); //加载QML
3 //用QQmlComponent创建一个组件的实例,并且赋值给object*,这步操作非常关键,Object类型可以转换其他任意类型,比如QQuickItem
4 QObject* object = component.create();
5 object->setProperty("width", 500); //元对象系统赋值操作
6 QQmlProperty(object, "width").write(500); //元对象系统赋值操作
7 QQuickItem* item = qobject_cast<QQuickItem*>(object); //把 QObject* 转换成 QQuickItem* 类型
8 tiem->setWidth(500); //QQuickItem* 赋值操作

(2)使用QQuickView加载,QQuickView是继承QWindow,所有可以加载一个可视化QML对象,并且可以与应用程序的图形用户界面进行融合。

实例

1 QQuickView view;                                                                   //QQuickView对象
2 view.setSource( QUrl(QStringLiteral("qrc:///main.qml"))); //加载QML
3 view.show(); //QQuickView可以显示可视化QML对象
4 QQuickItem* item = view.rootObject(); //返回当前QQuickView的根节点
5 tiem->setWidth(500); //QQuickItem* 赋值操作

2、使用对象名字访问加载的QML对象

QML中的所有节点都会绑定到根节点树上,QObject::objectName这个属性保存特定对象。QML组件的子对象可以在C++中通过 QObject::findChild()查找到在QML中用objectName定义的对象。

bool QObject::setProperty(const char *name, const QVariant &value)  元对象系统的设置函数
T QObject::findChild(const QString &name = QString(), Qt::FindChildOptionsoptions = Qt::FindChildrenRecursively) const  是一个QObject类型的模板函数,意味着可以转成任意类型如:

1 QPushButton* button = root.findChild<QPushButton*>("qml_button")
2
3 QObject* object = root.findChild<QObject*>("qml_object")
4
5 QQuickItem* item = root.findChild<QQuickItem*>("qml_item")

如果有多个对象使用objectName:"qml_button"同名标记,QObject::findChild返回最后一个标记的QML对象,QObject::findChildren返回所有标记的QML对象存放在QList类型的列表中。

实例

 1 QQuickView view;                                                              //QQuickView对象
2 view.setSource( QUrl(QStringLiteral("qrc:///main.qml"))); //加载QML
3 view.show(); //QQuickView可以显示可视化QML对象
4 QQuickItem* root = view.rootObject(); //返回当前QQuickView的根节点,底下可以绑定很多节点
5 //在根节点root中查找有objectName:"qml_button"这个标志位保存的QML节点qml_Button
6 QObject* button = root->findChild<QObject*>("qml_button");
7 button->setProperty("width", 500);
8 //在根节点root中查找有objectName:"qml_item"这个标志位保存的QML节点qml_item,换成QQuickItem*类型
9 QQuickItem* item = root->findChild<QQuickItem*>("qml_item");
10 item->setProperty("color", "red");

3、使用C++访问QML对象成员

(1)所有的QML对象都会暴露在Qt的元对象系统,C++可以通过元对象系统的QMetaObject::invokeMethod()调用QML中注册到元对象系统函数。

实例

1 // qml中定义的函数:
2 function qmlFunction(msg)
3 {
4 console.log("QML get message:",msg);
5 }
1 // C++调用QML函数:
2 QQmlEngine engine; //QML引擎
3 QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml"))); //加载QML
4 QObject* object = component.create(); //用QQmlComponent创建一个组件的实例,并且赋值给object*,这步操作非常关键,Object类型可以转换其他任意类型,比如QQuickItem
5 QVariant rValue;
6 QVariant msg = "Hello for C++";
7 QMetaObject::invokeMethod(object, "qmlFunction", Q_RETURN_ARG(QVariant,rValue), Q_ARG(QVariant, msg));

(2)C++可以接收所有的QML信号,QML也可以接收C++信号,在C++中可以使QObject::connect()进行接收信号槽。

实例

// qml中定义一个信号:
signal qmlSignal(string msg)
1 // C++进行连接信号:
2 QQuickView view; //QQuickView对象
3 view.setSource( QUrl(QStringLiteral("qrc:///main.qml"))); //加载QML
4 view.show(); //QQuickView可以显示可视化QML对象
5 QQuickItem* root = view.rootObject(); //返回当前QQuickView的根节点,底下可以绑定很多节点
6 QObject::connect(root, SIGNAL(qmlSignal(QString)), this, SLOT(Slotqml(QString)));

C++中调用QML对象的更多相关文章

  1. 在 C++ 中使用 QML 对象

    看过了如何在 QML 中使用 C++ 类型或对象,现在来看如何在 C++ 中使用 QML 对象. 我们可以使用 QML 对象的信号.槽,访问它们的属性,都没有问题,因为很多 QML 对象对应的类型,原 ...

  2. COM动态添加删除成员,类似JavaScript中调用的对象

    在JavaScript中调用对象时,可动态添加删除成员如: var obj=new Object; obj.member1='aaaaa'; obj.fun1=function() { alert(' ...

  3. Android NDK开发之Jni调用Java对象

    https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instan ...

  4. 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数

    关于构造函数的一个违反直觉的行为 我会以重复标题开始:你不应该在构造或者析构的过程中调用虚函数,因为这些调用的结果会和你想的不一样.如果你同时是一个java或者c#程序员,那么请着重注意这个条款,因为 ...

  5. .Net Remoting 调用远程对象

    根据需求,我们的系统必须以C/S方式构建,而且是三层架构,这样一来,就出现了服务器端和客户端通信的问题. 为了解决双方的通信问题,还要考虑效率.性能等方面,经过分析.试验,我们根据效率.移植.开发难易 ...

  6. 在Java中调用Python

    写在前面 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单.恰好我在项目中就遇到了这个问题 ...

  7. JAVAFX 2.0 javascript中调用java代码

    现在你已经知道如何在JavaFX中调用JavaScript.在本章中,你将了解到相反的功能——在web页面中调用JavaFX. 大体上的理念是在JavaFX程序中创建一个接口对象,并通过调用JSObj ...

  8. MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)

    ScriptControl接口 属性名称 类型 备注 AllowUI BOOL 检测是否允许运行用户的接口元素.如果为False,则诸如消息框之类的界面元素不可见. CodeObject Object ...

  9. 本地代码中使用Java对象

    通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函数.JNI通过ID识别域和方 ...

  10. [转]C# 互操作性入门系列(四):在C# 中调用COM组件

    传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...

随机推荐

  1. 全球首个无限执行的 AI 出现!给我玩爽了

    给 AI 一句话,它就能自主执行任务,生成复杂的大型网站.几十页的 PPT.万字爆款图文.千万字长篇小说? 据说这是世界上第一款无限的 AI 智能体 -- Flowith. 无限这个词听起来有点东西啊 ...

  2. controller的简单介绍

    介绍 Kubernetes控制器是一个主动调谐的过程,它会watch一些对象的期望状态,也会watch实际的状态,然后控制器会发送一些指令尝试让对象的当前状态往期望状态迁移. 控制器最简单的实现就是一 ...

  3. git add 报错The file will have its original line endings in your working directory

    执行如下命令,添加代码到本地仓库 git add . 出现警告信息:The file will have its original line endings in your working direc ...

  4. 优化PHP开发流程:精选工具与配置指南,提升代码质量与效率

    本文由 ChatMoney团队出品 在PHP开发领域,选择正确的工具可以极大地提升开发效率和代码质量. 集成开发环境(IDE) PHPStorm 是一个强大的IDE,专为PHP开发设计.它提供了丰富的 ...

  5. AI助手:Agent工作流程与应用场景详解

    引言 智能体(Agent)是一种在特定环境中自主行动.感知环境.做出决策并与其他智能体或人类进行交互的计算机程序或实体.它们具备自主性.反应性.社交性和适应性等特点,能够根据环境的变化调整自己的行为, ...

  6. 数栈技术分享:一文带你了解Flink jm、tm启动过程和资源分配

    一.JM启动过程 1.从日志角度分析启动流程 1)client生成jobGraph 详情请参考:https://www.bilibili.com/video/BV13K4y1P7ri 2)Yarn R ...

  7. Xamarin.Android 获取屏幕分辨率

    var metrics = Resources.DisplayMetrics;            Log.Debug("屏幕分辨率", $"宽={metrics.Wi ...

  8. 安卓端-APPUI自动化实战【上】

    当前UI自动化测试存在以下问题: 1.投入产出比低:在目前版本快速迭代的大背景下,app更新较快,维护脚本成本高,导致投入产出比低 2.对测试人员要求较高:必须有一定的编程能力 3.运行稳定性较差,断 ...

  9. SQL Server AVG函数取整问题

    SQL Sever的均值函数在求整数类型的数据均值是结果还是整数,并且不会四舍五入.也就是向下取整.这里先创建一个成绩表,并适当添加数据. CREATE TABLE sic( 学号 nchar(10) ...

  10. MySQL 14 count(*)这么慢,我该怎么办?

    count(*)的实现方式 在不同的MySQL引擎中,count(*)有不同的实现方式: MyISAM引擎把一个表的总行数存在磁盘上,执行count(*)时能直接返回总行数,效率很高: InnoDB引 ...