QT之信号与槽机制方式
QT提供了信号与槽机制用于完成界面操作的响应,是完成任意两个QT对象之间的通信方式,信号与槽进行关联,信号在某一个特定的情况和动作下触发,槽是等同于接收和处理信号的函数。因此可以把信号看做发射端,槽看做接收端。当一个类被继承时,其该类的信号和槽也同时会继承。
信号与槽机制的连接方式:
1、一个信号可以与另一信号进行连接,触发一个信号,将会一级一级的触发下一级信号,知道触发到槽为止。
connect(this,SIGNAL(signal1()),this,SIGNAL(signal0()));
2、一个信号可以与多个槽进行连接。
connect(this,SIGNAL(signal1()),this,SIGNAL(slot0()));
connect(this,SIGNAL(signal1()),this,SIGNAL(slot1()));
3、同一个槽可以接收多个信号。
connect(this,SIGNAL(signal0()),this,SIGNAL(slot0()));
connect(this,SIGNAL(signal1()),this,SIGNAL(slot0()));
测试例子:
1、建立一个工程,在UI里布局几个按键当做信号,一个TEXT显示端口。
2、实现代码:通过按键发送消息,在按键处理函数里,调用信号发送,初始化关联各个槽接口。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this,SIGNAL(sendsignal0()),this,SLOT(testSlot0()));
connect(this,SIGNAL(sendsignal0()),this,SLOT(testSlot1()));
connect(this,SIGNAL(sendsignal1()),this,SIGNAL(sendsignal0()));
connect(this,&MainWindow::sendsignal2,this,&MainWindow::testSlot2);
connect(this,&MainWindow::sendsignal3,this,&MainWindow::testSlot2);
}
void MainWindow::testSlot0()
{
Cnt0++;
QString str="接收到一个信号:"+QString::number(Cnt0)+" "+QString::number(Cnt1);
ui->lineEdit->setText(str);
}
void MainWindow::testSlot1()
{
Cnt1++;
QString str="接收到一个信号:"+QString::number(Cnt0)+" "+QString::number(Cnt1);
ui->lineEdit->setText(str);
}
void MainWindow::testSlot2()
{
Cnt2++;
QString str="接收到数据:"+QString::number(Cnt2) ;
ui->lineEdit->setText(str);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
emit sendsignal0();
}
void MainWindow::on_pushButton_2_clicked()
{
emit sendsignal1();
}
void MainWindow::on_pushButton_3_clicked()
{
emit sendsignal2();
}
void MainWindow::on_pushButton_4_clicked()
{
emit sendsignal3();
}
注:connect 函数上面有两种写法都是可以的。
connect(this,SIGNAL(sendsignal1()),this,SIGNAL(sendsignal0()));
connect(this,&MainWindow::sendsignal2,this,&MainWindow::testSlot2);
3、测试效果: