根据基类QWidget派生出两个类,MainWidget和SubWidget,分别对应主窗口和子窗口
主窗口
主窗口切换到子窗口,我们把SubWidget的对象作为MainWidget的数据成员
主窗口MainWidget 的定义以及成员函数的实现如下:
#ifndef MAINWIDGET_H#define MAINWIDGET_H#include <QPushButton>#include <QWidget>#include "subwidget.h" //子窗口头文件class MainWidget : public QWidget{Q_OBJECTpublic: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 "mainwidget.h"#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_OBJECTpublic:explicit SubWidget(QWidget *parent = nullptr);private:QPushButton b1;public:void mainwinSlot();signals:/** 信号必须有signals关键字来生命* 信号没有返回值,但是可以有参数* 信号就是函数的声明,只需声明,无需定义* 使用:emit mySignal();*/void mySignal();};#endif // SUBWIDGET_H
子窗口SubWidget类的成员函数的实现
#include "subwidget.h"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 "mainwidget.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);MainWidget w; //创建一个MainWidget对象先执行类的构造函数w.show();return a.exec();}