电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区
论坛
综合技术专区
Qt入门之信号与槽机制
Qt入门之信号与槽机制
静水竹林
LV5工程师
| 2016-09-01 08:55:24
浏览量 875
回复:4
发表新帖
一. 简介
就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。
信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。
信号
当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
槽
用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
信号与槽的连接
所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。
二. 特点
一个信号可以连接多个槽
当信号发射时,会以
不确定的顺序
一个接一个的调用各个槽。
多个信号可以连接同一个槽
即无论是哪一个信号被发射,都会调用这个槽。
信号直接可以相互连接
发射第一个信号时,也会发射第二个信号。
连接可以被移除
这种情况用得比较少,因为在对象被删除时,Qt会自动移除与这个对象相关的所有连接。语法如下:
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
三. 应注意的问题
信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。
如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。
宏定义不能用在 signal 和 slot 的参数中。
信号和槽的参数个数与类型必须一致。
四. 程序举例
这个demo程序由一个
Label
和
PushButton
组成,第一个例子中点击按钮,可以让label关闭,这是最简单的信号与槽的连接;第二例子中点击按钮,在label上获取当前系统时间,这个涉及到的知识点有:信号与槽的参数类型不同时如何连接、自定义槽函数、自定义信号。
首先,新建一个Qt GUI程序,父窗口选为
QDialog
,类名为
getTime
,在头文件和CPP文件分别加入如下代码(
小生愚钝,还没弄清楚博客园MarkDown代码块怎么高亮,所以只好贴截图了,见谅
)
头文件
实现文件
保存、编译、运行之后点击按钮即可看到label消失了。
然后在头文件中加入
自定义的槽函数和信号,并在CPP文件中实现槽函数
,具体如下:
头文件
实现文件
然后保存,编译运行即可,点击按钮后就能看到label上显示当前时间了。
转自:
http://www.cnblogs.com/MuyouSome/p/3515941.html
一. 简介
就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。
信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。
信号
当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
槽
用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
信号与槽的连接
所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。
二. 特点
一个信号可以连接多个槽
当信号发射时,会以
不确定的顺序
一个接一个的调用各个槽。
多个信号可以连接同一个槽
即无论是哪一个信号被发射,都会调用这个槽。
信号直接可以相互连接
发射第一个信号时,也会发射第二个信号。
连接可以被移除
这种情况用得比较少,因为在对象被删除时,Qt会自动移除与这个对象相关的所有连接。语法如下:
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
三. 应注意的问题
信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。
如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。
宏定义不能用在 signal 和 slot 的参数中。
信号和槽的参数个数与类型必须一致。
四. 程序举例
这个demo程序由一个
Label
和
PushButton
组成,第一个例子中点击按钮,可以让label关闭,这是最简单的信号与槽的连接;第二例子中点击按钮,在label上获取当前系统时间,这个涉及到的知识点有:信号与槽的参数类型不同时如何连接、自定义槽函数、自定义信号。
首先,新建一个Qt GUI程序,父窗口选为
QDialog
,类名为
getTime
,在头文件和CPP文件分别加入如下代码(
小生愚钝,还没弄清楚博客园MarkDown代码块怎么高亮,所以只好贴截图了,见谅
)
头文件
实现文件
保存、编译、运行之后点击按钮即可看到label消失了。
然后在头文件中加入
自定义的槽函数和信号,并在CPP文件中实现槽函数
,具体如下:
头文件
实现文件
然后保存,编译运行即可,点击按钮后就能看到label上显示当前时间了。
转自:
http://www.cnblogs.com/MuyouSome/p/3515941.html
0
收藏
举报
分享
×
微信分享
扫描二维码分享
qq分享
QQ空间分享
微博分享
我来回复
登录后可评论,请
登录
或
注册
所有回答
数量:
1
suoma
2016-09-01
我也在学习Qt
1
回复
举报
发布
静水竹林
回复
2016-09-01
:handshake
0
回复
举报
发布
电子大拿
回复
2016-09-08
来看看,学习一下
0
回复
举报
发布
×
举报
举报人:
被举报人:静水竹林
*
类型:
请选择类型
问题质量差
垃圾广告信息
偏离社区主题
违规内容
不友善内容
与社区已有问题重复
以上选项都不是
*
详细原因:
取消
提交
x
收藏成功!点击
我的收藏
查看收藏的全部帖子