信号与 槽是Qt框架中用于实现事件处理和消息传递的机制, 用于在对象之间进行通讯与交互。
信号(Signal)
信号是对象发出的一种通知,表示对象的状态已经发生了变化或者某个事件已经发生.
信号是Qt中特有的,是一种自定义的函数,通常没有具体的实现代码. 信号可以带有参数。
槽(Slot)
槽是用于相应信号的函数. 当一个信号被触发时,与之相连的槽函数会被调用。
槽函数可以执行任何操作,包括修改对象的状态、更新用户界面、逻辑处理等。
连接(Connect)
连接是建立信号与槽之间关联的过程。可以在代码中使用connect函数来连接一个信号和一个槽,以便在信号发出时调用槽函数。
连接通常在对象的构造函数中建立, 如果是局部变量需要多次连接信号与槽时,需要主动调用disconnect,来断开信号与槽,避免多次触发
下面是实现跳转页面并传递参数的简单示例:
信号发送者
Page1.h
#ifndef PAGE1_H
#define PAGE1_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui
{
class Page1;
}
QT_END_NAMESPACE
class Page1 : public QWidget
{
Q_OBJECT
public:
explicit Page1(QWidget *parent = nullptr);
~Page1();
signals:
void goToPage2(const QString &text); // 定义一个信号, 跳转Page2页面并传递一个参数
private slots:
void on_nextButton_clicked();
private:
Ui::Page1 *ui;
};
#endif // PAGE1_H
Page1.cpp
#include "page1.h"
#include "ui_page1.h"
#include <QDebug>
Page1::Page1(QWidget *parent) :
QWidget(parent),
ui(new Ui::Page1)
{
ui->setupUi(this);
}
Page1::~Page1()
{
delete ui;
qDebug() << "Page1析构";
}
void Page1::on_nextButton_clicked()
{
QString text = ui->lineEdit->text();
qDebug() << "准备进行页面跳转:" << text;
emit goToPage2(text); // 发射信号,传递参数
qDebug() << "发送信息";
}
界面效果:
信号接受者
Page2.h
#ifndef PAGE2_H
#define PAGE2_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui
{
class Page2;
}
QT_END_NAMESPACE
class Page2 : public QWidget
{
Q_OBJECT
public:
explicit Page2(QWidget *parent = nullptr);
~Page2();
signals:
void popView(); // 定义一个返回视图信号,返回上一个页面
public slots:
void setText(const QString &text); // 定义槽函数,接收参数并设置文本
private slots:
void on_backButton_clicked();
private:
Ui::Page2 *ui;
};
#endif // PAGE2_H
Page2.cpp
#include "page2.h"
#include "ui_page2.h"
#include <QDebug>
Page2::Page2(QWidget *parent) :
QWidget(parent),
ui(new Ui::Page2)
{
ui->setupUi(this);
}
Page2::~Page2()
{
delete ui;
qDebug() << "Page2析构";
}
void Page2::setText(const QString &text)
{
ui->label->setText(text); // 设置页面上的文本
}
void Page2::on_backButton_clicked()
{
qDebug() << "点击返回按钮";
emit popView ();
}
界面效果:
发送信号与接收信号
借助MainWindow实现Page1与Page2页面的切换与参数传递
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStackedWidget>
#include "page1.h"
#include "page2.h"
namespace Ui
{
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
// 定义槽。用于Page1发送信号后, 可以在MainWindow内部处理跳转逻辑
void goToPage2(const QString &text);
// 定义返回槽。用于Page2发送信号后,可以在MainWindow内部处理返回到Page1处理逻辑
void goBack();
private:
QStackedWidget *stackedWidget;
Page1 *page1 = nullptr;
Page2 *page2 = nullptr;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建页面对象
page1 = new Page1(this);
// 连接Page1的信号与MainWindow的槽函数
connect(page1, &Page1::goToPage2, this, &MainWindow::goToPage2);
// 页面跳转方式1: 使用QStackedWidget跳转
stackedWidget = new QStackedWidget(this);
setCentralWidget(stackedWidget);
// 将页面添加到页面堆栈中
stackedWidget->addWidget(page1);
// 初始显示Page1
stackedWidget->setCurrentWidget(page1);
}
MainWindow::~MainWindow()
{
delete ui;
delete page1;
delete page2;
qDebug() << "MainWindow析构";
}
void MainWindow::goToPage2(const QString &text)
{
qDebug() << "跳转页面" << text;
if (!page2) // 如果Page2尚未创建,则创建它
{
qDebug() << "创建page2";
page2 = new Page2(this);
connect(page2, &Page2::popView, this, &MainWindow::goBack);
stackedWidget->addWidget(page2);
}
page2->setText(text); // 在Page2中设置传递的文本
stackedWidget->setCurrentWidget(page2); // 切换到Page2
}
void MainWindow::goBack ()
{
qDebug() << "返回页面";
if (stackedWidget->currentIndex() > 0)
{
stackedWidget->setCurrentIndex(stackedWidget->currentIndex() - 1);
}
}