在qt中,当用户操作当前窗口部件时,需要其他窗口部件响应时,使用信号与槽的机制,会更灵活,更方便.信号与槽是qt的核心功能之一,它是一种松耦合的关系.发送信号的只管发射信号,接收信号的也只管接收,它不需要知道谁发送,谁接收,因此,这种机制更灵活便捷.
使用信号与槽机制,需要在类中声明宏Q_OBJECT
定义信号(signals),使用signals关键字在类中声明.信号不能也无需实现.发送信号需要用关键字emit + 信号名.例如 emit Comeon()
Q_OBJECT
signals://信号声明. 不能也无需实现
void Comeon(QString& str);
void Comeon2(QString& str);
void Comeon3();
void Comeon4();
定义槽函数(slots),槽函数就是接收到信号后响应执行的函数.
private slots://槽函数
void on_whBtn_clicked();
void on_zgBtn_clicked();
void on_sjBtn_clicked();//自动连接,on_对象名_点击信号
//该槽方法响应Comeon()发送的信号.
//信号与槽方法参数列表一一对应.槽方法的参数只能比信号的参数少,不能多!!!
void ComeonGuys(QString& str);
void ComeChina(QString& str);
void ComeHuaxia();
void ComePeople();
连接信号与槽,使用connect函数,对信号与槽进行连接.connect实现的参数有:谁发送信号?发送什么信号?谁接收信号?接收到信号后需要执行什么方法? 以下面的代码为例:
this即为当前窗口对象,执行了Comeon(QString&)信号,this为当前窗口接收信号,执行槽方法ComeonGuys(QString&).
connect(this,SIGNAL(Comeon(QString&)),this,SLOT(ComeonGuys(QString&)));
这是qt关于connect函数的实现源码,参数是:sender发送信号者,signal发送的信号,receiver信号接收者,method执行的槽方法,type连接的类型.在这里连接类型默认为AutoConnection(自动连接).
static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal,
const QObject *receiver, const QMetaMethod &method,
Qt::ConnectionType type = Qt::AutoConnection);
信号与槽的连接方法有4种:
1.一个信号连接一个槽方法.
connect(this,SIGNAL(Comeon(QString&)),this,SLOT(ComeonGuys(QString&)));
2.一个信号连接多个槽方法 .
一个信号Comeon(),连接了ComeChina(),ComeHuaxia() 2个槽方法.也就是说,发送一个信号,就会执行2个槽方法 ComeChina(),ComeHuaxia()(多个槽方法).
//一对多 一个信号响应多个槽方法.....信号,槽方法的参数名称不用写
connec