栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Qml与C++交互3:Qml的信号与C++的槽函数连接
    • 1、C++槽函数实现
    • 2、Qml控件增加`objectName`属性
    • 3、C++找到Qml控件实例
    • 4、连接信号和槽
    • 5、自定义带参信号
      • 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("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、自定义带参信号

在qml的Button控件中定义一个信号,然后再定义一个变量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: "< 
信号和槽的连接 
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”,获取资源链接。有任何疑问也可以公众号里留言咨询。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931947.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号