Qt: 信号与槽


信号是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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值