Qml与C++交互1:C++调用Qml的接口
Qml与C++交互1:C++调用Qml的接口
总体思路:
- qmll控件中添加一个js函数
- 通过qml引擎找到qml控件实例
- 使用
QMetaObject::invokeMethod
来调用qml控件中的Js函数。
另一种方法,可以通过setProperty
来设置qml控件的属性。
1、JS接口
- 给控件定义一个
objectName
- 实现一个js函数
Text {
objectName: "textLabel"; // 控件定义一个objectName
text: "Hello World";
font.pixelSize: 26;
Layout.leftMargin: 10
// js函数
function getText() {
return text;
}
}
2、找到qml控件实例
-
通过qml引擎找到根节点
auto root = engine.rootObjects();
rootObjects
声明如下,其作用是:返回由QQmlApplicationEngine
实例化的所有根对象的列表。QList<QObject *> QQmlApplicationEngine::rootObjects() const
-
通过qml控件的
objectName
来找到对应控件的C++对象QObject* textLable = root.first()->findChild<QObject*>("textLabel");
root.first()
,由于我们这个引擎只有一个根对象,所以拿到第一个根对象进行查找子节点的操作。findChild<QObject*>("textLabel")
,声明如下,是一个模板函数,其作用是返回该对象名称为name
的子对象,该子对象可以被强制转换为T类型,如果没有这样的对象,则返回nullptr
template <typename T> T QObject::findChild( const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
3、QMetaObject::invokeMethod
- 使用
QMetaObject::invokeMethod
来调用Js函数。
QMetaObject::invokeMethod(textLable, "getText", Q_RETURN_ARG(QVariant, ret));
4、实现代码
// cpp调用qml接口、数据
auto root = engine.rootObjects();
QObject* textLable = root.first()->findChild<QObject*>("textLabel");
QVariant ret;
QMetaObject::invokeMethod(textLable, "getText", Q_RETURN_ARG(QVariant, ret));
qDebug()<<"ret: "<<ret;
5、运行结果
ret: QVariant(QString, "Hello World")
完整实现可关注并回复:“qml_1”。