Qt实现主窗口和子窗口的切换

在这里插入图片描述
学习中遇到不明白的按F1查帮助文档!

1.根据基类QWidget派生出两个类,MainWidget和SubWidget
2.这里需要强调的一点的只有如何从子窗口切换到主窗口:因为为了把主窗口切换到子窗口,我们把SubWidget的对象作为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);

    void sendSlot();

signals:
    /* 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用: emit mySignal();
     */
    void mySignal();

private:
    QPushButton b;
};

#endif // SUBWIDGET_H

再看SubWidget成员函数的实现:

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    b.setParent(this);
    b.setText("切换到主窗口");
    b.move(100,100);
    this->setWindowTitle("子窗口");
    this->resize(400,300);

    connect(&b,&QPushButton::pressed,this,&SubWidget::sendSlot);

}
void SubWidget::sendSlot()
{
    emit mySignal();//发送广播
}

在SubWidget的成员函数中自定义了一个槽函数,用来emit mySignal();,接着主窗口就会收到并处理子窗口的信号(MainWidget 中自定义槽函数实现)。

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

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include<QPushButton>

#include "subwidget.h"//子窗口头文件

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);//带默认参数的构造函数
    void myslot();
    void changeWin();//切换到子窗口,并隐藏主窗口
    void dealSub();//处理子窗口发来的信号
    ~MainWidget();
private:
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;

    SubWidget w;//子窗口类的对象作为主窗口类的数据成员
};
#endif // MAINWIDGET_H

#include "mainwidget.h"
#include<QPushButton>
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)//基类QWidget,派生类MainWidget
{
    b1.setParent(this);
    b1.setText("关闭窗口");
    b1.move(100,100);

    b2=new QPushButton(this);//使用QPushButton的构造函数指定父对象
    b2->setText("abc");
    this->setWindowTitle("主窗口");
    this->resize(400,300);

    b3.setParent(this);
    b3.setText("切换到子窗口");
    b3.move(50,50);


    //把光标放到要查看的类名上(这里是QPushButton),按两次F1,去它的基类中找信号函数signal或槽函数slot
    connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
    /* &b1:信号发出者,指针类型
     * &QPushButton::pressed:处理的信号   &发送者的类名::信号名字
     * this:信号接收者
     * &MainWidget::close:槽函数,信号处理函数  &接收的类名::槽函数名字
     */

    //接下来自定义一个槽
    /* 自定义槽,普通函数的用法
     * 可以是任意的成员函数,普通全局函数,静态函数
     * 槽函数需要和信号一致(参数一致,返回值一致)
     * 由于信号都是没有返回值的,所以,槽函数一定也是void
     */
    connect(b2,&QPushButton::released,this,&MainWidget::myslot);
    connect(b2,&QPushButton::released,&b1,&QPushButton::hide);




    //接下来进行窗口切换任务
    connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);
    //处理子窗口的信号
    connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSub);



}
void MainWidget::changeWin()
{
    w.show();//子窗口显示
    this->hide();//本窗口隐藏
}
void MainWidget::dealSub()
{
    this->show();//本窗口显示
    w.hide();//子窗口隐藏
}
void MainWidget::myslot()
{
    b2->setText("123");
}
MainWidget::~MainWidget()
{
}


主函数如下:

#include "mainwidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w;//执行MainWidget的构造函数,在MainWidget的构造函数中构造子对象
    w.show();
    return a.exec();
}

发布了241 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/104865267
今日推荐