跳转至

信号与槽

信号与槽的机制简述


  信号与槽是Qt中的核心特性,其用于多个对象间的通信,通过组件发出信号(Signal),(Solts)函数接收,实现不同组件之间的通信。

 其中,信号和槽函数是松耦合的,当一个对象发出信号,该对象不知道也不关心哪个对象的槽函数会接收这个信号。Qt的信号和槽函数机制确保,如果将一个信号连接到一个槽函数上,该槽函数将在正确的时间被调用。信号和槽函数可以接受任意数量的任意类型的参数。它们完全是类型安全的。所有从QObject或它的一个子类(例如,QWidget)继承的类都可以使用信号和槽槽函数机制。当对象改变其状态时,可能就会发出信号(这一点由开发人员和父类确定其关联的信号什么时候发出)。

信号 [Signal]


 信号就是事件(按钮点击、内容发生改变等),或者状态(窗口选中、切换等);当程序触发了某种事件,那么即可发射出来一个信号。

槽 [Solt]


 如果想捕获这个信号,然后执行相应的逻辑代码,那么就需要使用到槽,槽实际上是一个函数,当信号发射出来后,会执行与之绑定的槽函数。

连接信号与槽


 为了实现触发某个信号时想执行对应的函数,就需要将信号和对应的槽函数绑定到一起,这个过程的实现如图:

连接信号与槽需要使用:connect() 其中 connect 函数接收四个参数:

  1. 谁发出的信号
  2. 发出的什么信号
  3. 谁处理这个信号
  4. 如何处理这个信号

connect 函数在使用时,需要书写在 widget.cpp 中的构造函数中。

示例程序
#include "mainwindow.h"
#include "ui_mainwindow.h"

Widget::Widget(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 这个 connect 函数位于这个窗口的构造函数中
    // 其需要接收四个参数:谁发出的信号,发出的什么信号,谁处理信号,如何处理信号
    connect();
}

MainWindow::~MainWindow()
{
    delete ui;
}

例如,将LineEdit这个文本框发出的信号连接至槽函数中:

连接信号与槽
connect(ui->lineEdit, SIGNAL(returnPressed()), this, SLOT(on_pushButton_clicked()));

传入参数

这个函数接收了四个参数

该参数为:谁发出的信号,即ui控件中名为:lineEdit 的文本框空间。

该参数为:发出的什么信号,即returnPressed() 该函数是属于QLineEdit中的信号函数,其作用为当用户在该文本框中按下回车即会发出returnPressed() 这个信号。

该参数为:谁处理这个信号,即处理该信号的函数问该构造函数本身。

该参数为:谁处理这个信号,即该参数便将该信号连接到了槽函数returnPressed(on_pushButton_clicked())中。

对于信号与槽函数的连接,connect 函数还有第二种写法,即用对地址的访问来绑定相应的参数:

通过地址
#include "mainwindow.h"
#include "ui_mainwindow.h"

Widget::Widget(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->exitbutton, &QPushButton::clicked, this, &MainWindow::on_cancaleButton_clicked);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_cancaleButton_clicked(){
    this->close();
}