Qt信号与槽机制是类型安全的,松耦合,更灵活方便;
信号(Signal)是在特殊情况下发射的事件,如PushButton最常见的鼠标单击发射的clicked()信号,发射信号使用Qt的emit关键字,Qt的signals关键字指出进去了信号声明区,随后可声明自己的信号;
定义信号:
signals:
void ComeOn(QString &str);//信号不能与无需实现
发射信号:
QString str="666";
emit ComeOn(str);
槽(Slot)就是对信号响应的函数,可以声明在类的任何部分(public\private\protected)可以具有任何参数,也可以被直接调用。槽函数与一般函数不同,槽函数可以与一个信号关联,放信号被发射时,关联的槽函数自动执行。
声明槽函数的方法:
private slots:
void ComeOnGuys(QString &str);
//槽函数处理工作
void ComeOnGuys(QString &str){
qDebug() << str;//需加头文件#include<qDebug>
}
信号与槽关联是用 QObject::connect() 函数实现:
QMetaObject::Connection QObject::connect(
const QObject *sender, //信号发送者
const char *signal, //发送的信号
const QObject *receiver, //信号接收者
const char *method, //表示与信号连接的方式的字符串,可以是槽或信号
Qt::ConnectionType type = Qt::AutoConnection //连接方式,默认自动连接
)
常用格式:connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
connect方法采用SIGNAL()及SLOT()时,这里的函数原型只能写出类型,不能有任何参数名,否则连接将会失败。
同时信号与槽连接方式:
1)Qt::AutoConnection:(默认连接方式)自动方式,由系统自动选择连接方式。
2)Qt::DirectConnection:直接方式,信号发射时,立即调用槽。
3)Qt::QueuedConnection:队列方式,信号发射时产生一个事件进入队列,事件被处理时槽才能调用。
4)Qt::BlockQueuedConnection:阻塞队列方式,信号发射时产生一个事件进入队列,然后当前线程进入阻塞状态,直到事件处理完毕,若接收方位于发送信号的线程中,则程序会死锁,故此连接方式仅用于多线程。
信号与槽的关联特点:
1、一个信号连接一个槽
connect(sender, SIGNAL(single1()), receiver, SLOT(slotFun()));
2、一个信号连接一个信号
connect(sender, SIGNAL(single1()), receiver, SIGNAL(single2()));
3、一个信号连接多个槽,关联信号的槽函数按建立时的顺序依次执行
connect(sender, SIGNAL(single1()), receiver1, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver2, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver3, SLOT(slotFun()));
4、多个信号连接一个槽
connect(sender1, SIGNAL(single1()), receiver, SLOT(slotFun()));
connect(sender2, SIGNAL(single2()), receiver, SLOT(slotFun()));
connect(sender3, SIGNAL(single3()), receiver, SLOT(slotFun()));
5、信号与槽的自动关联
_xxxx.h文件中 connectSlotsByName()方法通过对象名支持信号与槽的自动关联。不采用connect()函数而是采用on_objectName_signal命名方式命名槽达到自动关联的效果
如类头文件中声明槽方法:
private slots:
void on_sjBtn_clicked();//自动连接,on_对象名_信号
信号与槽断开连接
disconnect(const QObject* sender,const char* signal,const QObject *receiver,const char* method);
1、断开与一个信号的所有连接
disconnect(sender,0,0,0);
2、断开一个指定信号的所有关联
disconnect(sender, SIGNAL(single1()), 0, 0);
3、断开与一个指定接受者receiver的所有关联
disconnect(sender, 0, receiver, 0);
4、断开指定信号与槽的关联
//第一种方法
disconnect(sender, SIGNAL(single1()), receiver, SLOT(slotFun()));
//第二种方法
private:
QmetaObject::Connection m_res;//保存信号与槽的返回值
--------------------------------------
m_res = connect(this,SIGNAL(Comeon(QString &)),this,SLOT(ComeonGuys(QSring &)));
disconnect(m_res);
信号与槽机制的优越性:
1.信号与槽机制是类型安全的,相关联的信号与槽参数必须匹配
2.信号与槽是松耦合的,信号发送者不知道也不需知道接受者的信息。
3.信号与槽可以使用任意类型的任意数量的参数。