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”。
请添加图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值