Qt中的信号与槽(Signals and Slots)

Qt中的信号与槽(Signals and Slots)是一种用于对象间通信的机制,常用于处理用户界面事件和数据更新等情况。通过信号与槽,可以实现对象之间的解耦和灵活的交互。

信号(Signal)是对象发出的事件或通知,可以是任何函数的名称,常以emit关键字作为前缀声明。例如,一个按钮点击的信号可以是clicked()

槽(Slot)是接收信号的函数,被绑定到信号上,用于处理信号发出的事件。槽函数可以是普通的成员函数、静态函数,甚至是Lambda表达式。槽函数的声明和定义与普通函数无异。

使用信号与槽的步骤如下:

  1. 在发送信号的对象中声明信号,例如在QPushButton类中声明clicked()信号。

  2. 在接收信号的对象中定义槽函数,用于处理该信号发出的事件。

  3. 使用connect()函数将信号与槽连接起来,在适当的时机执行这个连接操作。例如:connect(sender, SIGNAL(clicked()), receiver, SLOT(handleClick()))。新版本的Qt可以使用更现代的语法connect(sender, &Sender::signal, receiver, &Receiver::slot)

  4. 当发送信号的对象触发相关事件时,通过emit关键字发出信号。

  5. 信号被发出后,与之连接的槽函数会自动被调用,执行相关的操作。

通过信号与槽,可以实现灵活的对象间通信,而无需显式地了解或修改对方的实现细节。这种松耦合的设计使得代码更加模块化和可维护。

需要注意的是,信号与槽的连接操作通常需要在QObject派生类中进行,且需要在应用程序的事件循环中使用。

下面是个简单的Qt Widgets Application 例程:
文件名:mainwindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    
    
    /* 设置窗体的宽为 1280,高为 720 */
    this->resize(1280, 720);

    /* 实例化 pushButton 对象 */
    pushButton = new QPushButton(this);

    /* 调用 setText()方法设定按钮的文本 */
    pushButton->setText("我是一个按钮");

    /* 信号与槽连接 */
    connect(pushButton, SIGNAL(clicked()), this,
            SLOT(pushButtonClicked()));

    connect(this, SIGNAL(pushButtonTextChanged()), this,
            SLOT(changeButtonText()));
}

MainWindow::~MainWindow()
{
    
    
}

/* 实现按钮点击槽函数 */
void MainWindow::pushButtonClicked()
{
    
    
    /* 使用 emit 发送信号 */
    emit pushButtonTextChanged();
}

/* 实现按钮文本改变的槽函数 */
void MainWindow::changeButtonText()
{
    
    
    /* 在槽函数里改变按钮的文本 */
    pushButton->setText("被点击了! ");
}

文件名:mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
/* 引入 QPushButton */
#include <QPushButton>

class MainWindow : public QMainWindow
{
    
    
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
     /* 声明一个信号,只需声明,无需定义 */
     void pushButtonTextChanged();

public slots:
 /* 声明一个槽函数 */
 void changeButtonText();

 /* 声明按钮点击的槽函数 */
 void pushButtonClicked();

 private:
 /* 声明一个对象 pushButton */
 QPushButton *pushButton;

};
#endif // MAINWINDOW_H

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_37787043/article/details/131641243