前言
上一节介绍了将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端信息的能力了。