QT主窗口与子窗口

根据基类QWidget派生出两个类,MainWidget和SubWidget,分别对应主窗口和子窗口

主窗口

主窗口切换到子窗口,我们把SubWidget的对象作为MainWidget的数据成员

主窗口MainWidget 的定义以及成员函数的实现如下:

#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QPushButton>
#include <QWidget>
#include "subwidget.h"  //子窗口头文件

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 "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_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.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();
}
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值