创建多个窗口

我们在这里实验的是创建两个窗口,每个窗口中有两个按钮,点击其中一个会隐藏当前窗口,显示另一个窗口

这是我们的项目栏:



首先我们在mainwindow.h中创建一个按钮,命名为“切换到子窗口”


然后在mainwindow.cpp中:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    b1.setParent(this);
    b1.setText("切换到主窗口");
    b1.move(50,50);
    w.show();
}


然后准备创建子窗口:

扫描二维码关注公众号,回复: 2163777 查看本文章


添加c++的class


选择基类是QWidget



然后在subwidge.h这个基类中写入:

private:
    QPushButton b;
};


然后在subwidge,cpp中:

#include "subwidge.h"
 
 
subwidge::subwidge(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("子窗口");
    b.setParent(this);
    b.setText("切换到主窗口");
 
 
}


然后再mainwindow.h中添加头文件:

#include"subwidge.h"

并且创建对象w:


最后在mainwindow.cpp中加入show函数:

b1.setParent(this);
    b1.setText("切换到主窗口");
    b1.move(50,50);
    w.show();

然后我们先实现点击主窗口按钮,隐藏主窗口,显示子窗口

现在Mainwindow.h头文件中定义函数:

 void changeWin();

然后在它的子类Mainwindow.cpp中说明这个跟函数:

void MainWindow::changeWin()
{
    //子窗口显示
    w.show();
    //本窗口隐藏
    this->hide();
}


然后再这个文件中

connect(&b1,&QPushButton::pressed,this,&MainWindow::changeWin);

表示在主窗口中按下b1按钮的时候主窗口接受changeWin这个函数


这样就实现了切换到子窗口的步骤

然后我们要实现子窗口切换到主窗口

但是我们发现在subwidge.h头文件中没有子窗口对象w,只有按钮b


所以我们不能直接调用w


下面,我们要在subwidge.h中定义一个信号:


并且定义一个槽函数:

void sendSlot();


这样在切换到subwidge.cpp

说明sendSlot函数:

subwidge::sendSlot()
{
    emit mySignal();
}
 
 

定义一个槽:

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

就是点击b按钮的时候发送一个信号出去


到mainwindow.h中定义一个函数

void dealSub();

回到mainwindow.cpp

说明这个dealSub函数:

void MainWindow::dealSub()
{
    //子窗口隐藏
    w.hide();
    //主窗口显示
    this->show();
}

然后

connect(&w,&subwidge::mySignal,this,&MainWindow::dealSub);

表示w发出一个信号mySignal,接受以后调用了dealSub函数

完成!!


总结一下重点:

1.mainwindow.h中一定加上头文件:

#include"subwidge.h"

并且创建subwidge对象,这样才能命令subwidge窗口


2.

connect(&w,&subwidge::mySignal,this,&MainWindow::dealSub);

这句话很重要,因为这里自己定义了一个信号

并且发送这个mySignal信号是通过:

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

最后提供一下代码:

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QPushButton>
#include"subwidge.h"
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    void mySlot();
    void changeWin();
    void dealSub();
    ~MainWindow();
private:
    QPushButton b1;
    subwidge w;
};

#endif // MAINWINDOW_H

subwidge.h:

#ifndef SUBWIDGE_H
#define SUBWIDGE_H

#include <QWidget>
#include<QPushButton>
class subwidge : public QWidget
{
    Q_OBJECT
public:
    explicit subwidge(QWidget *parent = nullptr);
    void sendSlot();

signals:
    void mySignal();

public slots:
private:
    QPushButton b;
};

#endif // SUBWIDGE_H


mainwindow.cpp:

#include "mainwindow.h"
#include<QPushButton>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(400,300);
    b1.setParent(this);
    b1.setText("切换到子窗口");
    b1.move(50,50);
    this->setWindowTitle("主窗口");
    //w.show();
    connect(&b1,&QPushButton::pressed,this,&MainWindow::changeWin);
    //处理子窗口的信号
    connect(&w,&subwidge::mySignal,this,&MainWindow::dealSub);
}
void MainWindow::mySlot()
{
    b1.setText("123");
}
void MainWindow::changeWin()
{
    //子窗口显示
    w.show();
    //本窗口隐藏
    this->hide();
}
void MainWindow::dealSub()
{
    //子窗口隐藏
    w.hide();
    //主窗口显示
    this->show();
}
MainWindow::~MainWindow()
{

}

subwidge.cpp

#include "subwidge.h"

subwidge::subwidge(QWidget *parent) : QWidget(parent)
{
    resize(400,300);
    this->setWindowTitle("子窗口");
    b.setParent(this);
    b.setText("切换到主窗口");
    connect(&b,&QPushButton::pressed,this,subwidge::sendSlot);
}
void subwidge::sendSlot()
{
    emit mySignal();
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

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



猜你喜欢

转载自blog.csdn.net/scwmason/article/details/81043045