Qt信号与槽机制源码分析与总结

什么是信号与槽

信号与槽用于两个对象之间的通信,信号和槽机制是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类型

猜你喜欢

转载自blog.csdn.net/Jacksqh/article/details/106457419