QML学习笔记(四十四)QML与C++交互:对QML对象设置objectName

前言

上一节介绍了将C++类对象属性暴露给QML端,使qml端可以通过暴露名称,直接调用该类的接口。

而再介绍其他方法之前,先反过来介绍C++端主动获取QML端组件属性的方法,以此来打通双向的交互。

本节介绍的,是通过对QML的组件对象,设置一个对象名objectName,这个东西类似于id,可以在c++端通过对象名查找,查找到具体的object对象。

一、QML 里给组件起名字

cpp 复制代码
Rectangle {
    id: camRect
    objectName: "videoRect"      // C++ 找它用的句柄
    width: 640
    height: 480
}

类似这样,在常规的设置组件时,给它添加一个objectName属性。

二、C++ 里找到对象

cpp 复制代码
// 假设 engine 已经 load 完 QML
QObject *rectObj = engine.rootObjects().first()->findChild<QObject*>("videoRect");
if (!rectObj) return;

// 读属性
int w = rectObj->property("width").toInt();
int h = rectObj->property("height").toInt();
qDebug() << "宽高" << w << h;

// 写属性
rectObj->setProperty("width", 800);

之后,我们对engine通过findChild的方式,查找到对应对象名的QObject。当然,这有可能是空的,要注意判断。

之后,就可以通过property接口读取到它的属性。你甚至可以设置属性,以此开改变qml中组件的属性值。

三、若 QML 自己声明了 函数 或 信号 同样可调

cpp 复制代码
QVariant ret;
QMetaObject::invokeMethod(rectObj, "mapToGlobal",
                          Q_RETURN_ARG(QVariant, ret),
                          Q_ARG(QVariant, QPointF(10, 10)));

如果这个组件中声明和函数或信号,还可以直接调用源对象的invokeMethod接口,来进行接口的调用。

四、总结

至此,我们C++端应该具备基本的,主动获取qml端信息的能力了。

相关推荐
布莱克6053 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
LabVIEW开发3 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
benchmark_cc4 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
前进的李工5 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
Zenova EdgeOS5 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是5 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing035 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
正在走向自律6 小时前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付
Fatbobman(东坡肘子)6 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
揽星河..7 小时前
【C语言】底层程序设计
c语言·开发语言