一,什么是信号和槽
他是是实现对象跟对象之间的通信,即一个对象发生了改变会发送一个信号通知另一个对象执行一个函数,这个函数被称为槽
二,简介介绍
(1)信号
信号只用声明,不用定义
signal:
void SignalA();
void SignalA(int x);
void SignalA(QString text);
void SignalA(int a,QString b);
发送信号用emit关键字
void MyQt : public signal()
{
int a = 10;
QString x = "nihao";
emit signalA(a);
emit signalB(x);
}
(2) 槽
槽的声明只能在头文件中进行,Qt的slots关键字指出了槽声明区,随后声明自己的槽
(注意:槽函数如果只声明不实现,会出现编译报错)
槽函数的实现跟普通函数实现没有区别,当与槽函数关联的信号被发送时,槽函数就会被调用,普通调用是通过函数名或者函数指针调用。
三,信号与槽的连接
连接方式:
1,手动连接
参数依次为:发送信号的对象,发送的信号,接受信号的对象,接收方式,连接类型
2,自动连接
通过命名连接,此图中就是在一个槽函数中连接,tabWidget是发送信号的对象名,tabBarClicked是发送的信号。
3,连接规则
(1)信号的参数可以比槽多,反之不行 ;
(2)信号与槽的关系可以是一对一,一对多,多对一;
(3)信号也可以跟信号连接;
(4)连接可以被删除;
(5)同一个连接可以绑定多次,触发一次信号会执行多次槽函数。
四,连接类型
(1)直连方式:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程;
(2)排队方式:槽函数运行于信函接收者所在线程,发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用;
(3)自动方式:默认方式,若接收者跟发送者在同一个线程,则自动使用Qt::DirectConnection类型,否则自动使用Qt::QueuedConnection类型;
(4)阻塞排队方式:发送信号后发送者所在的线程会阻塞,直到槽函数运行完后,接收者和发送者绝对不能在一个线程,否则会程序锁死;
(5)唯一连接方式:这个flag可以通过按位或跟上面四个结合在一起使用,当这个flag设置时,当某个信号与槽已经连接时,再重复的连接就会失败,也就是避免了重复使用。
五,元对象系统
(1)功能
提供了对象间的通信机制,信号与槽以及运行时类型信息和动态属性系统的支持。时标准c++的一个扩展,让Qt能更好的实现GUI图形界面编程
(2)组成
类声明私有段中的Q_OBJECT宏
首先确认该类型继承来自QDbject(可能时间接),类的基本信息,Qt关键字。
总结
信号与槽是Qt的基础,也是很重要的组成部件,后期所有的Qt编程都需要用到信号跟槽。