通俗的理解信号与槽
信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。
信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号。发射信号使用Qt的emit关键字。QT 的 signals 关键字指出进入了信号声明区,随后即可声明自己的信号。
以上是比较官方的理解方式,但是我们可以通俗的理解为:
信号的存在是为了给槽方法进行通信,传输信息,哪怕不在一个界面。说先将一个槽方法绑定指定的信号,当别的组件需要调用该方法时候,直接调用被绑定的信号即可。
因为信号绑定比较灵活,关联的时候有一对一,一对多,多对一,多对多的关系
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232730536.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021071623275290.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232801865.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716232813258.png)
如下演示的就是一个槽对一个信号的传输:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
signals:
void comeon(QString &str); //信号与曹不能实现,也无需实现
private slots:
void on_WHButton_clicked();
void iamwuhan(QString &str);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
在这里插入代码片
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this,SIGNAL(comeon(QString&)),this,SLOT(iamwuhan(QString&)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_WHButton_clicked()
{
QString str="你好武汉!";
comeon(str);
}
void MainWindow::iamwuhan(QString &str)
{
qDebug() <<str;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210716233558376.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BsdXRvMTIxOQ==,size_16,color_FFFFFF,t_70)
点击这里的武汉的按钮,就会发送“你好武汉!”
先定义一个槽A,定义一个槽B。然后定义一个信号c。
用一个从connect函数关联槽B和信号c。之后槽A调用信号c,就会调用函数
B。
①一个信号连接一个槽:
connect(sender, SIGNAL(single1()), receiver, SLOT(slotFun()));
②一个信号连接一个信号:
connect(sender, SIGNAL(single1()), receiver, SIGNAL(single2()));
③一个信号连接多个槽,关联信号的槽函数按照建立连接时的顺序依次执行:
connect(sender, SIGNAL(single1()), receiver1, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver2, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver3, SLOT(slotFun()));
④多个信号连接一个槽:
connect(sender1, SIGNAL(single1()), receiver, SLOT(slotFun()));
connect(sender2, SIGNAL(single2()), receiver, SLOT(slotFun()));
connect(sender3, SIGNAL(single3()), receiver, SLOT(slotFun()));
⑤ 信号与槽的自动关联:
ui_xxxx.h文件中 connectSlotsByName()方法通过对象名支持信号与槽的自动关联。不采用connect()函数而是采用on_objectName_signal命名方式命名槽达到自动关联的效果。
信号与槽的断开关联:
QObject::disconnect(const QObject* sender,const char* signal,const QObject receiver,const char method);
①断开与一个对象所有的信号的所有关联
disconnect(sender,0,0,0);
等价于:
sender->disconnect();
②断开与一个指定信号的所有关联
disconnect(sender, SIGNAL(single1()), 0, 0);
等价于:
sender->disconnect(SIGNAL(single1()));
③ 断开与一个指定接受者receiver的所有关联
disconnect(sender, 0, receiver, 0);
等价于:
sender->disconnect(SIGNAL(single1()));
④断开指定信号与槽的关联:
disconnect(sender, SIGNAL(single1()), receiver, SLOT(slotFun()));
等价于:
disconnect(myConnection); //myConnection为connect()的返回值