我们在这里实验的是创建两个窗口,每个窗口中有两个按钮,点击其中一个会隐藏当前窗口,显示另一个窗口
这是我们的项目栏:
首先我们在mainwindow.h中创建一个按钮,命名为“切换到子窗口”
然后在mainwindow.cpp中:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
b1.setParent(this);
b1.setText("切换到主窗口");
b1.move(50,50);
w.show();
}
然后准备创建子窗口:
添加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();
}
如果各位读者觉得还可以的话,请粉我一下哦,哈哈~~