Qt使用信号与槽实现多窗口切换,3个窗口的切换,ABC窗口切换

目录

项目要求:

分析:

核心代码:

A类头文件:a.h

A类的源文件:a.cpp

B类的头文件:b.h

B类源文件: b.cpp

C类头文件:c.h

C类源文件:c.cpp


可以先查看前一篇帖子:

Qt 两个窗口切换,AB窗口切换源码演示-CSDN博客

前一篇实现的是2个窗口的切换,可能很多人不一定能真正的理解信号槽在多窗口切换的操作细节,往往一不小心就会进入死胡同,导致两个界面的头文件相互包含,编译通不过;

本文将继续升级到3个窗口的切换。

项目要求:

        有A,B,C三个界面,每个界面上分别有一个按钮,点击按钮就会切换到另一个界面上,同时当前界面隐藏,具体效果顺序:A-->B-->C-->A;形成一个闭环的切换效果;

        A界面为主界面,默认显示;B、C界面为子界面,默认不显示;

分析:

        要求A界面为主界面先显示,那就得把其他界面对象及功能槽都放到A界面类里面来,其他的2个界面B、C只需要负责发信号来触发功能即可。

        A类: 有3个对象:this,B对象,C对象

                  有3个槽:A-->B 的槽;B-->C 的槽; C-->A 的槽;

       B类:有一个信号,点击按钮发射信号;

       C类:有一个信号,点击按钮发射信号;

好了,分析完成,上代码;

核心代码:

A类头文件:a.h

#ifndef A_H
#define A_H

#include <QMainWindow>
#include "b.h"
#include "c.h"

namespace Ui {
class A;
}

class A : public QMainWindow
{
    Q_OBJECT

public:
    explicit A(QWidget *parent = 0);
    ~A();

private slots:
    void on_pushButton_clicked();
    void showCHideB();
    void showAHideC();

private:
    Ui::A *ui;
    B *m_b;
    C *m_c;
};

#endif // A_H

A类的源文件:a.cpp

#include "a.h"
#include "ui_a.h"

A::A(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::A)
{
    ui->setupUi(this);
    m_b = new B(this);
    m_c = new C(this);
    // 以下connect函数使用了第四种写法,非常安全
    connect(m_b,QOverload<>::of(&B::bSignal),this,QOverload<>::of(&A::showCHideB));
    connect(m_c,QOverload<>::of(&C::cSignal),this,QOverload<>::of(&A::showAHideC));
}

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

void A::on_pushButton_clicked()
{
    this->hide();  // A隐藏
    m_b->show();   // B显示
}

void A::showCHideB()
{
    m_b->hide(); // B隐藏
    m_c->show(); // C显示
}

void A::showAHideC()
{
    m_c->hide(); // C隐藏
    this->show(); // A显示
}

B类的头文件:b.h

#ifndef B_H
#define B_H

#include <QMainWindow>

namespace Ui {
class B;
}

class B : public QMainWindow
{
    Q_OBJECT

public:
    explicit B(QWidget *parent = 0);
    ~B();
signals:
    void bSignal();

private slots:
    void on_pushButton_clicked();

private:
    Ui::B *ui;
};

#endif // B_H

B类源文件: b.cpp

#include "b.h"
#include "ui_b.h"

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

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

void B::on_pushButton_clicked()
{
    emit bSignal();
}

C类头文件:c.h

#ifndef C_H
#define C_H

#include <QMainWindow>

namespace Ui {
class C;
}

class C : public QMainWindow
{
    Q_OBJECT

public:
    explicit C(QWidget *parent = 0);
    ~C();

signals:
    void cSignal();

private slots:
    void on_pushButton_clicked();

private:
    Ui::C *ui;
};

#endif // C_H

C类源文件:c.cpp

#include "c.h"
#include "ui_c.h"

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

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

void C::on_pushButton_clicked()
{
    emit cSignal();
}

运行效果:

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Qt 中,一个信号可以连接多个。如果您想要连接多个,可以使用以下两种方法: 1. 多次连接同一个信号: ```cpp connect(sender, SIGNAL(mySignal()), receiver1, SLOT(mySlot())); connect(sender, SIGNAL(mySignal()), receiver2, SLOT(mySlot())); ``` 这样,当 `sender` 发出 `mySignal()` 信号时,`receiver1` 和 `receiver2` 都会执行 `mySlot()` 函数。 2. 使用 `Qt::DirectConnection` 连接方式,将多个函数链接为单个函数: ```cpp connect(sender, SIGNAL(mySignal()), receiver, SLOT(myCombinedSlot()), Qt::DirectConnection); ``` 在 `receiver` 类中,定义一个 `myCombinedSlot()` 函数,将多个函数的逻辑代码组合在一起。当 `sender` 发出 `mySignal()` 信号时,`receiver` 就会执行 `myCombinedSlot()` 函数,从而执行多个函数的逻辑代码。 在多窗口之间使用信号时,需要注意以下几点: 1. 如果信号函数在不同的窗口中,需要使用 `connect()` 函数将它们连接起来。例如: ```cpp connect(window1, SIGNAL(mySignal()), window2, SLOT(mySlot())); ``` 这样,当 `window1` 中发出 `mySignal()` 信号时,`window2` 中的 `mySlot()` 函数会被执行。 2. 如果信号函数在同一个窗口中,只需要在窗口类的头文件中声明信号函数,并使用 `connect()` 函数将它们连接起来。例如: ```cpp class MyWindow : public QWidget { Q_OBJECT public: explicit MyWindow(QWidget *parent = nullptr); ~MyWindow(); signals: void mySignal(); public slots: void mySlot(); }; // 在构造函数中连接信号函数 MyWindow::MyWindow(QWidget *parent) : QWidget(parent) { connect(this, SIGNAL(mySignal()), this, SLOT(mySlot())); } // 在函数中发出信号 void MyWindow::mySlot() { emit mySignal(); } ``` 这样,在 `MyWindow` 窗口中发出 `mySignal()` 信号时,`mySlot()` 函数就会被执行,从而实现多窗口之间的信号传递。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五木大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值