Q_OBJECT
使用信号与槽的类中,必须要加入宏 Q_OBJECT
signal & slot
信号与槽之间的绑定
QObject::connect(sender , SIGNAL(signal()), receiver, SLOT(slot()));
QObject :是QT所以类的父类
connect() :是一个静态函数
sender:是发送信号的对象名称,参数为指针
signal():是发送的对象的信号函数名称
receive:是槽函数对象的名称,参数为指针
slot():是接受对象的槽函数名称
SIGNAL() 和 SLOT() 是用来指明信号和槽,并将其转为相对应的字符串。
信号与槽的断开,
信号与槽的根本是由信号触发槽,只要将信号设置为断联,就不可能产生槽函数,所有断联主要针对信号函数
//断开一切与 sender 对象连接的信号与槽。
QObject::disconnect(sender,0,0,0); //静态写法
sender->disconnect(); //非静态写法
//断开特定信号的连接
QObject::disconnect(sender,SIGNAL(signal),0,0); //静态写法
sender->disconnect(SIGNAL(signal()));
//与指定的接收者断开连接
QObject::disconnect(sender, 0, receiver, 0);
sender->disconnect(receiver);
信号与槽的关系
1.当多个槽函数与一个信号连接时,先建立连接的槽函数先执行,是队列的关系。
2.信号与槽建立连接时,函数有参数要写出参数类型,严格来说信号参数要与槽参数一致,当信号参数少于槽参数会报错。(信号只是通知者,参函数执行时缺少参数会报错,信号参数多时,参函数只会取靠近函数名的参数,因为参数的入栈是从后往前入栈)
3.多个信号可以连接同一个槽,信号可以连接信号。
4.槽函数是异步执行,当发送一个信号,槽函数会打断现在的执行过过程,槽函数执行完毕,恢复执行过程。
信号与槽的实现
1.信号需要在 signals 修饰的区域进行定义。
2.信号的定义不需要关键字 public 修饰。
3.槽函数可以是成员函数,静态成员函数,全局函数。
4.信号和槽的返回类型和参数类型要一致。
总结
在信号与槽中,信号是不需要定义,槽需要定义,因为 moc 会根据 Q_OBJECT 这个字符串进行检测该类是否需要将 信号定义出一个向消息队列发送消息,且进行信号与槽之间得关联。信号与槽得实现大体为调用信号函数,即向队列发送消息,主线程专门等待队列的消息,获取到消息,去寻找相对应的槽函数执行。槽函数最好在主线程,即UI线程中调用,在其他线程想要调用槽函数,最好转为触发信号函数,与之关联的槽函数会相应执行。