Qt中的信号与槽(Signals and Slots)是一种用于对象间通信的机制,常用于处理用户界面事件和数据更新等情况。通过信号与槽,可以实现对象之间的解耦和灵活的交互。
信号(Signal)是对象发出的事件或通知,可以是任何函数的名称,常以emit关键字作为前缀声明。例如,一个按钮点击的信号可以是clicked()
。
槽(Slot)是接收信号的函数,被绑定到信号上,用于处理信号发出的事件。槽函数可以是普通的成员函数、静态函数,甚至是Lambda表达式。槽函数的声明和定义与普通函数无异。
使用信号与槽的步骤如下:
-
在发送信号的对象中声明信号,例如在QPushButton类中声明
clicked()
信号。 -
在接收信号的对象中定义槽函数,用于处理该信号发出的事件。
-
使用
connect()
函数将信号与槽连接起来,在适当的时机执行这个连接操作。例如:connect(sender, SIGNAL(clicked()), receiver, SLOT(handleClick()))
。新版本的Qt可以使用更现代的语法connect(sender, &Sender::signal, receiver, &Receiver::slot)
。 -
当发送信号的对象触发相关事件时,通过emit关键字发出信号。
-
信号被发出后,与之连接的槽函数会自动被调用,执行相关的操作。
通过信号与槽,可以实现灵活的对象间通信,而无需显式地了解或修改对方的实现细节。这种松耦合的设计使得代码更加模块化和可维护。
需要注意的是,信号与槽的连接操作通常需要在QObject派生类中进行,且需要在应用程序的事件循环中使用。
下面是个简单的Qt Widgets Application 例程:
文件名:mainwindow.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 设置窗体的宽为 800,高为 480 */
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