所谓信号槽,实际就是观察者模式 (发布 - 订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
信号(Signal)
信号(Signal) 就是在特定情况下被发射的事件, 例如 按钮最常见的信号就是鼠标
单击时发射的 clicked() 信号, 一个 ComboBox 最常见的信号是选择的列表项变化时发射
的 CurrentIndexChanged() 信号。
GUI 程序设计的主要内容就是对界面上各组件的信号的响应, 只需要知道什么情况下发射
哪些信号, 合理地去响应和处理这些信号就可以了。
槽(Slot)
就是对信号响应的函数。 槽就是一个函数, 与一般的 C++函数是一样的, 可以定义在类的
任何部分(public、 private 或 protected) , 可以具有任何参数, 也可以被直接调用。 槽函
数与一般的函数不同的是: 槽函数可以与一个信号关联, 当信号被发射时, 关联的槽函数被
自动执行。
信号与槽关联是用 QObject::connect() 函数实现的, 其基本格式是:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
参数 1、 信号的发送者
参数 2、 发送的信号
参数 3、 信号的接收者
参数 4、 处理函数(槽函数)
QMetaObject::Connection QObject::connect(
const QObject *sender, PointerToMemberFunction signal,
const QObject *receiver, PointerToMemberFunction method,
Qt::ConnectionType type = Qt::AutoConnection);
参数:
- sender: 发出信号的对象
- signal: 属于sender对象, 信号是一个函数, 这个参数的类型是函数
指针, 信号函数地址
- receiver: 信号接收者
- method: 属于receiver对象, 当检测到sender发出了signal信号,
receiver对象调用method方法,信号发出之后的处理动作
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//start是QPushButton 用connect 连接 发送者 接受者
connect(ui->start,&QPushButton::clicked,this,&MainWindow::close);
}
MainWindow::~MainWindow()
{
delete ui;
}