什么是信号与槽
信号与槽用于两个对象之间的通信,信号和槽机制是Qt的核心特征,也是Qt不同于其他开发框架的最突出的特征。在GUI编程中,当改变了一个部件时,总希望其他部件也能了解到该变化。更一般来说,我们希望任何对象都可以和其他对象进行通信。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QString.h>
#include<QDebug.h>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT //信号与槽的宏定义
signals: //信号成员
void Comeon(QString& str);
void Comeon2();
void Comeon3();
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots: //槽方法
void on_whButton_clicked();
void on_ChinaButton_clicked();
void on_worldButton_clicked();
void ComeonGuys(QString&str);
void ComeonHuaxia();
void Comeon2Slot();
void Comeon3Slot();
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
注意:发送的信号的参数一定要比其对应的槽方法的参数多或者相等,要不然会报错。
信号和槽的关联方式:
1、一对一(信号和槽)
connect(this,SIGNAL(发射的信号),this,SLOT(对应执行的槽方法));
//让信号Comeon与槽方法Comeonwh建立链接
//方式1
connect(this,SIGNAL(Comeon(QString&)),this,SLOT(ComeonGuys(QString&)));
//方式2
connect(this,&MainWindow::Comeon,this,&MainWindow::ComeonGuys);
2、一对一(信号和信号)
connect(this,SIGNAL(发射的信号),this,SIGNAL(引发的另一个信号));
//一个信号的发射引发其他信号的发射
connect(this,SIGNAL(Comeon(QString&)),this,SIGNAL(Comeon2()));
3、一对多
和一对一的语法是一样的不同的其实是多次的建立连接
//让信号Comeon与槽方法Comeonwh建立链接
connect(this,SIGNAL(Comeon(QString&)),this,SLOT(ComeonGuys(QString&)));
//让信号Comeon与槽方法Comeon2Slot建立链接
connect(this,SIGNAL(Comeon(QString&)),this,SLOT(Comeon2Slot()));
//让信号Comeon与槽方法Comeon3Slot建立链接
connect(this,SIGNAL(Comeon(QString&)),this,SLOT(Comeon3Slot()));
4、多对一
//让信号Comeon与槽方法Comeon2Slot建立链接
connect(this,SIGNAL(Comeon(QString&)),this,SLOT(Comeon2Slot()));
//让信号Comeon2与槽方法C哦么onSlot建立连接
connect(this,SIGNAL(Comeon2()),this,SLOT(Comeon2Slot()));
断开连接
//在建立连接时是怎么定义的就怎么断开(注意连接时是有两种方式
void MainWindow::on_pushButton_clicked()
{
qDebug()<<"断开this对象中Comeon信号与槽方法ComeonGuys的连接";
disconnect(this,SIGNAL(Comeon(QString&)),this,SLOT(ComeonGuys(QString&)));
}
void MainWindow::on_pushButton_2_clicked()
{
qDebug()<<"断开this对象中Comeon信号与其连接的所有槽方法";
disconnect(this,SIGNAL(Comeon(QString&)),this,0);//对于同一对象中
//disconnect(this,SIGNAL(Comeon(QString&)),0,0); //所有,无论是在该对象还是其他的对象
}
void MainWindow::on_pushButton_3_clicked()
{
qDebug()<<"断开this对象中所有信号与其连接的槽";
disconnect(this,0,this,0); //断开的是this对象中的全部信号和this对象的全部槽的连接
//disconnect(this,0,0,0); //断开的是this对象中的全部信号和全部对象中的槽的连接
}
看下面的运行结果:
注意事项
①connect方法采用SIGNAL()及SLOT()时,这里的函数原型只能写出类型,不能有任何参数名,否则连接将会失败。
②信号与槽中信号不需要定义且类型为void,槽方法基本上是不带返回值的void类型