目录
可以先查看前一篇帖子:
前一篇实现的是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();
}
运行效果: