Qml与C++交互3:Qml的信号与C++的槽函数连接

请添加图片描述
更多资讯、知识,微信公众号搜索:“上官宏竹”。


通过将qml中的信号连接到C++对象的槽函数中,完成某些事件的相应。

总体思路:在C++类中增加一个槽函数,然后通过引擎的findChild根据名称查找到对应的qml控件对象指针,然后将qml控件的信号与C++的槽函数连接起来。

1、C++槽函数实现

class MyClass : public QObject {
	Q_OBJECT
public slots:
    void qmlClicked() {
    	qDebug()<<__FUNCTION__<<" QML signal disposed to here!";
    }
}

注意:

  • C++类需要继承自QObject对象,并且增加Q_OBJECT的声明。
  • C++类中的信号和槽函数不需要声明Q_INVOKABLE宏,也可以被qml调用。

2、Qml控件增加objectName属性

Button {
	text: "Quit";
	objectName: "mybutton";	
}

增加objectName属性,是为了在C++中能通过objectName属性名称找到对应的qml控件实例。

3、C++找到Qml控件实例

auto root = engine.rootObjects();
auto button = root.first()->findChild<QObject*>("mybutton");

QT有对象树的概念,所有子对象都挂在了父对象的子对象链表中,root.first()表示qml引擎的第一个根节点(一般都是一个根节点),然后调用模板函数findChild根据objectName找到对应的控件实例。

4、连接信号和槽

qml控件的Button的点击信号clicked与C++中的实例myInfo的槽函数qmlClicked连接起来。

QObject::connect(button, SIGNAL(clicked()), &myInfo, SLOT(qmlClicked()));

信号槽连接后,用户鼠标点击button后,会触发clicked的发送,进而触发qmlClicked的执行。

5、自定义带参信号

qmlButton控件中定义一个信号,然后再定义一个变量count代表单击的次数,在单击Button时发送信号,并带入单击次数。在C++的槽函数中打印单击次数。

Qml自定义信号

Button {
	...
	property int count: 0			// 单击次数
	signal myRectsignal(int count)	// 定义一个带参数的信号

	onClicked: {
		count++
		myRectsignal(count)			// 发射信号
	}
}

C++槽函数定义

void MyClass::myRectSlot(int count)
{
    qDebug()<<__FUNCTION__<<" count: "<<count;
}

信号和槽的连接

QObject::connect(button, SIGNAL(myRectsignal(int)), &myInfo, SLOT(myRectSlot(int)));

运行结果

MyClass::myRectSlot  count:  1
MyClass::myRectSlot  count:  2
MyClass::myRectSlot  count:  3
MyClass::myRectSlot  count:  4
MyClass::myRectSlot  count:  5

完整实现可以微信搜索公众号:“上官宏竹”,或者扫下面的二维码,关注并回复:“qml_3”,获取资源链接。有任何疑问也可以公众号里留言咨询。


更多资讯、知识,微信公众号搜索:“上官宏竹”。
请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值