书接上回,没有基础或者看不懂的童鞋可以速览一下QT笔记1_八两x的博客-CSDN博客
这次我们主要实现两个窗口之间的切换功能
1 新建窗口
①右键点击工程文件夹,选择“添加新文件”或Add New...(版本不一样显示的不一样)
②选择C++ -> C++ Class,然后点击choose
③这里的Name可以随便写,我写的SubWidget,但是Base class一定要选择QWidget
④接着下一步,完成,就有新窗口啦。工程文件也会出现下边的文件:
2 实现两个窗口切换
新建好窗口后,我们的目标变成了:点击主窗口的某个按钮,可以显示子窗口,主窗口隐藏;点击子窗口的按钮,主窗口显示,子窗口隐藏
2.1 主窗口->子窗口
①对mainwidget.h操作。首先,声明一个新按钮b3;其次,声明一下子窗口的存在,告诉主窗口:你有一个小弟了;最后,添加一个自定义槽函数changeWin()用来执行切换窗口的任务。
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "subwidget.h" //子窗口头文件
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
void myslot();
void changeWin();//切换窗口的槽函数
private:
QPushButton b1;
QPushButton *b2;
QPushButton b3; //新的b3按钮
SubWidget w1; //声明子窗口w1
};
#endif // MAINWIDGET_H
②对mainwidget.cpp操作。
首先定义changeWin函数,代码+解释如下
void MainWidget::changeWin()
{
//子窗口显示
w1.show();
//本窗口隐藏
this->hide();
}
其次,初始化b3,再写信号与槽函数,代码+解释如下
b3.setParent(this); //设置b3的父类
b3.setText("切换到子窗口"); //设置b3的文本
b3.move(50, 50); //设置b3的位置
connect(&b3, &QPushButton::released, this, &MainWidget::changeWin);//当b3放开时,切换窗口
到此为止,我们就实现了通过主窗口调用子窗口。
2.2 子窗口->主窗口
子窗口调用主窗口要麻烦得多,就像老板可以说:小李,给我拿个快递。你不能给老板说:老李,给我买包烟去。你只能说:老板,你看这个方案可不可行,老板感兴趣就会处理,不感兴趣直接置之不理。子窗口和主窗口的关系一个道理。
主窗口可以自由调用子窗口,但是子窗口要调用主窗口要发送申请信号,主窗口可以选择处理或者不处理。
① 对subwidget.h进行操作。首先定义一个按钮b,再定义一个槽函数来实现发送信号,最后定义一个信号。代码如下
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = nullptr);
void sendSlot(); //发送信号的槽函数
signals:
/* 信号必须有signals关键字来声明
* 信号没有返回值,但可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:emit mySignal();
*/
void mySignal(); //被发送的信号
public slots:
private:
QPushButton b; //声明的按钮
};
#endif // SUBWIDGET_H
②对subwidget.cpp进行操作。 先初始化按钮,再定义信号与槽,最后槽函数发送信号。
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("Bro"); //设置子窗口名称
b.setParent(this); //设置子窗口位置
b.setText("切换到主窗口"); //设置按钮文本
connect(&b, &QPushButton::clicked, this, &SubWidget::sendSlot); //按钮点击时,触发sendslot函数
resize(400, 300); //将页面大小控制为400*300
}
void SubWidget::sendSlot()
{
emit mySignal(); //发送mySignal信号;发送使用emit
}
接下来就是看主窗口如何处理这个信号了
③在mainwidget.h中添加一个信号处理函数的声明。
public:
void dealSub();
④在mainwidget.cpp中处理信号。首先在mainwidget函数里添加这么一段话:
connect(&w1, &SubWidget::mySignal, this, &MainWidget::dealSub);
//当子窗口w1发送信号mySignal时,当前窗口(this)执行dealSub
⑤定义dealSub
void MainWidget::dealSub()
{
//子窗口隐藏
w1.hide();
//主窗口显示
this->show();
}
到此为止,一个主窗口和子窗口互相调用的功能就实现啦。