根据基类QWidget派生出两个类,MainWidget和SubWidget,分别对应主窗口和子窗口
主窗口
主窗口切换到子窗口,我们把SubWidget的对象作为MainWidget的数据成员
主窗口MainWidget 的定义以及成员函数的实现如下:
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QPushButton>
#include <QWidget>
#include "" //子窗口头文件
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = nullptr);
~MainWidget();
void mySlot();//自定义一个槽函数
void subwinSlot();
void subwinSlot2();
private:
QPushButton b1;
QPushButton *b2;
QPushButton b3;
SubWidget sub_w; //创建一个子窗口对象,子窗口类的对象作为主窗口类的数据成员
};
#endif // MAINWIDGET_H
其中 SubWidget sub_w; //创建一个子窗口对象,子窗口类的对象作为主窗口类的数据成员
#include ""
#include <QPushButton>
MainWidget::MainWidget(QWidget *parent) //构造函数
: QWidget(parent)
{
b1.setParent(this);
b1.setText("close");
b1.move(100,100);
b2=new QPushButton; //创建一个动态内存
b2->setText("按钮2");
b2->move(100,200);
b2->setParent(this);
connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
/*
* &b1:信号发出者,指针类型
* &QPushButton::Press:处理的信号, &发送者的类名::信号的名字
* this:信号接收者
* &MainWidget::close: 槽函数,信号处理函数 &接收的类名::槽函数的名字
*/
/*
* 自定义槽函数,普通函数的用法
* Qt5:任意的成员函数,普通全局函数,静态函数
* 槽函数需要和信号一致(参数,返回值)
* 由于信号都是没有返回值,所以槽函数也没有返回值
*/
connect(b2,&QPushButton::released,this,&MainWidget::mySlot); //b2动态分配空间,本来就是指针
connect(b2,&QPushButton::pressed,&b1,&QPushButton::hide);
this->setWindowTitle("主窗口");
b3.setParent(this);
b3.setText("切换到子窗口");
b3.move(50,50);
connect(&b3,&QPushButton::pressed,this,&MainWidget::subwinSlot);
//处理子窗口的信号
connect(&sub_w,&SubWidget::mySignal,this,&MainWidget::subwinSlot2);
//设置窗口大小
this->resize(800,600);
}
void MainWidget::mySlot()//成员函数的定义
{
b2->setText("123");
}
void MainWidget::subwinSlot()
{
//显示子窗口
this->hide();
sub_w.show();
}
void MainWidget::subwinSlot2()
{
this->show();
sub_w.hide();
}
MainWidget::~MainWidget() //析构函数
{
}
子窗口
实现从子窗口切换到主窗口
这里用到了关键字signals(这是Qt的功能,不是C++的)
子窗口SubWidget的定义如下:
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = nullptr);
private:
QPushButton b1;
public:
void mainwinSlot();
signals:
/*
* 信号必须有signals关键字来生命
* 信号没有返回值,但是可以有参数
* 信号就是函数的声明,只需声明,无需定义
* 使用:emit mySignal();
*/
void mySignal();
};
#endif // SUBWIDGET_H
子窗口SubWidget类的成员函数的实现
#include ""
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("子窗口");
b1.setParent(this);
b1.setText("返回主窗口");
b1.move(100,100);
connect(&b1,&QPushButton::released,this,&SubWidget::mainwinSlot);
//使用自定义的槽函数
//设置窗口大小
this->resize(800,600);
}
void SubWidget::mainwinSlot()
{
emit mySignal();//自定义槽函数的功能为发出信号
}
主窗口处理子窗口请求信号—返回主窗口界面
//处理子窗口的信号
connect(&sub_w,&SubWidget::mySignal,this,&MainWidget::subwinSlot2);
void MainWidget::subwinSlot2()
{
this->show();
sub_w.hide();
}
主函数如下:
#include ""
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w; //创建一个MainWidget对象先执行类的构造函数
w.show();
return a.exec();
}