Qt创建 简单的窗口跳转代码 (first 跳转到second; second跳转到first )
头文件包含 Second_Winsow.h 和 widget.h
我的思路是先创建两个窗口( First 和 second), 有两种方式 ,让一个窗口为另外一个的成员。 或者创建两个类,两个窗口对象相互独立存在。
//这里演示 让second 类成员成为First类的成员
先看Second类的结构,
Second_Winsow.h
#ifndef SECOND_WINSOW_H
#define SECOND_WINSOW_H
#include <QWidget>
class Second_Winsow : public QWidget
{
Q_OBJECT
public:
explicit Second_Winsow(QWidget *parent = nullptr);
signals:
//自定义的信号
void Sent_Widget();
//自定义的槽函数
public slots:
void receiveS_btn();
};
#endif // SECOND_WINSOW_H
在头文件里我就写了 自定义信号和自定义槽函数 。当然这是后话所以先不用看这个头文件
Second_Winsow.cpp
#include "second_winsow.h"
#include<QPushButton>
Second_Winsow::Second_Winsow(QWidget *parent) : QWidget(parent)
{
//设置窗口的名字大小
this->setWindowTitle("SecondWindow");
this->resize(500,500);
//创建按钮的一些属性
QPushButton *S_btn=new QPushButton("jumpFirst",this);
S_btn->show();
}
在这个主文件里 我首先设置了窗口的名字大小,然后设置了一个跳转到First类窗口对象 的按钮
S_btn 。下面的自定义信号函数和槽函数是后话,忽略掉
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "second_winsow.h"
class Widget : public QWidget
{
Q_OBJECT
private :
void ChangeWindow();
Second_Winsow SEC;
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif // WIDGET_H
这个头文件,我将second_window类 对象作为 Widget(first) 类的成员,以便于
创建widget对象的同时 ,创建Second_windows对象。
widget.cpp
#include "widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//设置窗体名字和窗口大小
this->setWindowTitle("firstWindow");
this->resize(200,200);
//设置按钮
QPushButton *F_btn=new QPushButton("jumpSecnod",this);
F_btn->show();
//设置跳转,(自定义槽函数)关闭自己的窗口,打开sencon窗口
connect(F_btn,&QPushButton::released,this,&Widget::ChangeWindow);
i
}
void Widget::ChangeWindow()
{
//隐藏自己窗口
this->hide();
//显示second窗口
SEC.show();
}
Widget::~Widget()
{
}
这里我设置了widget的窗口名字 和窗口大小,同时设置了跳转到Second类对象 窗口的按钮 F_btn .
此时我们就可以写一个connect 当我们接受到 F_btn 的信号的时候,就执行 槽函数ChangeWindows () //隐藏自己窗口 //显示second窗口
这样我们就实现了 First 窗口向 Second 窗口的跳转。 我们还要从Second 窗口跳到First 窗口
总结:
/*之前让Widget窗体直接对Second控制的方式是 在Widget 类中创建了Second 类对象SEC ,这样能实现,创建Widget对象的时候
也创建了second对象窗体(Second类是单独添加新文件), 同时设置Widget的子按钮F_btn发出信号,Widget窗体(this)接受信号
,自定义槽函数,使得Widget隐藏,second 类对象 SEC窗体 显示 */
/* 但现在就不能再在 Second类中加Widget 类对象了,这样会乱套*/
/* 所以我们就要让 Sencond 类的SEC 对象的S_btn 发出信号,让Widget类对象接受信号,同时Widget类对象 显示,Second类对象隐藏
*/
当我们点击SEC对象的 S_btn 的时候,接收点击信号的槽函数应该发送一个信号,如果在Widget 对象中接收到这个槽函数发出的对象 ,就在Widget对象中 执行关闭 Second窗口,打开First 窗口。为什么要在Widget对象中执行呢,因为SEC对象中不能直接关联到fWidget 对象,自然无法隐藏First窗口
再看 second_window .cpp,我们增加了 connect 函数和配套的自定义槽函数 和槽函数函数体中的 自定义信号, 用emit 触发信号
#include "second_winsow.h"
#include<QPushButton>
Second_Winsow::Second_Winsow(QWidget *parent) : QWidget(parent)
{
//设置窗口的名字大小
this->setWindowTitle("SecondWindow");
this->resize(500,500);
//创建按钮的一些属性
QPushButton *S_btn=new QPushButton("jumpFirst",this);
S_btn->show();
//触发S_btn 然后本窗体的槽函数接受触发信息 然后槽函数函数体执行 发出信号
connect(S_btn,&QPushButton::clicked,this,&Second_Winsow::Sent_Widget);
//接着就是让Widget 接受Sent_Widget信号了
}
void Second_Winsow::receiveS_btn()
{
//发出信号
emit Sent_Widget();
}
当然我们的second_window头文件也要做出一点点改变
#ifndef SECOND_WINSOW_H
#define SECOND_WINSOW_H
#include <QWidget>
class Second_Winsow : public QWidget
{
Q_OBJECT
public:
explicit Second_Winsow(QWidget *parent = nullptr);
//新增的自定义信号
signals:
void Sent_Widget();
//新增的槽函数
public slots:
void receiveS_btn();
};
#endif // SECOND_WINSOW_H
我们要让主函数 接收到这个信号 同时 执行一个槽函数,槽函数的函数体应该实现 隐藏自己的窗口,显示First 窗口
#include "widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//方案一: 创建两个 单独的类 student类和 teacher类
/* teacher发出饿了的信号,students 接受信号。
*/
//方案二: 引入一个source, second类 继承自widget
//设置窗体名字和窗口大小
this->setWindowTitle("firstWindow");
this->resize(200,200);
//设置按钮
QPushButton *F_btn=new QPushButton("jumpSecnod",this);
F_btn->show();
//设置跳转,(自定义槽函数)关闭自己的窗口,打开sencon窗口
connect(F_btn,&QPushButton::released,this,&Widget::ChangeWindow);
//接受来自Second类对象 的信号,如果接收到该信号,就执行槽函数 ,处理该信号
connect(&SEC,&Second_Winsow::Sent_Widget,this,&Widget::DealSent);
}
void Widget::ChangeWindow()
{
//隐藏自己窗口
this->hide();
//显示second窗口
SEC.show();
}
void Widget:: DealSent()
{ //显示自己的窗口
this->show();
//隐藏Second_windows
SEC.hide();
}
Widget::~Widget()
{
}
下面给出完整代码
Second_Winsow.h
#ifndef SECOND_WINSOW_H
#define SECOND_WINSOW_H
#include <QWidget>
class Second_Winsow : public QWidget
{
Q_OBJECT
public:
explicit Second_Winsow(QWidget *parent = nullptr);
signals:
void Sent_Widget();
public slots:
void receiveS_btn();
};
#endif // SECOND_WINSOW_H
second_winsow.cpp
#include "second_winsow.h"
#include<QPushButton>
Second_Winsow::Second_Winsow(QWidget *parent) : QWidget(parent)
{
//设置窗口的名字大小
this->setWindowTitle("SecondWindow");
this->resize(500,500);
//创建按钮的一些属性
QPushButton *S_btn=new QPushButton("jumpFirst",this);
S_btn->show();
/*之前让Widget窗体直接对Second控制的方式是 在Widget 类中创建了Second 类对象SEC ,这样能实现,创建Widget对象的时候
也创建了second对象窗体(Second类是单独添加新文件), 同时设置Widget的子按钮F_btn发出信号,Widget窗体(this)接受信号
,自定义槽函数,使得Widget隐藏,second 类对象 SEC窗体 显示 */
/* 但现在就不能再在 Second类中加Widget 类对象了,这样会乱套*/
/* 所以我们就要让 Sencond 类的SEC 对象的S_btn 发出信号,让Widget类对象接受信号,同时Widget类对象 显示,Second类对象隐藏
*/
//触发S_btn 然后本窗体的槽函数接受触发信息 然后槽函数函数体执行 发出信号
connect(S_btn,&QPushButton::clicked,this,&Second_Winsow::Sent_Widget);
//接着就是让Widget 接受Sent_Widget信号了
}
void Second_Winsow::receiveS_btn()
{
//发出信号
emit Sent_Widget();
}
Widget.h (first.h)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "second_winsow.h"
class Widget : public QWidget
{
Q_OBJECT
private :
void ChangeWindow();
Second_Winsow SEC;
void DealSent();
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//方案一: 创建两个 单独的类 student类和 teacher类
/* teacher发出饿了的信号,students 接受信号。
*/
//方案二: 引入一个source, second类 继承自widget
//设置窗体名字和窗口大小
this->setWindowTitle("firstWindow");
this->resize(200,200);
//设置按钮
QPushButton *F_btn=new QPushButton("jumpSecnod",this);
F_btn->show();
//设置跳转,(自定义槽函数)关闭自己的窗口,打开sencon窗口
connect(F_btn,&QPushButton::released,this,&Widget::ChangeWindow);
//接受来自Second类对象 的信号,如果接收到该信号,就执行槽函数 ,处理该信号
connect(&SEC,&Second_Winsow::Sent_Widget,this,&Widget::DealSent);
}
//首先要有两个窗口,且一个窗口为另外一个的成员。 或者创建两个类,两个窗口对象相互独立存在。
//这里演示 second为first类的成员
void Widget::ChangeWindow()
{
//隐藏自己窗口
this->hide();
//显示second窗口
SEC.show();
}
void Widget:: DealSent()
{
this->show();
SEC.hide();
}
Widget::~Widget()
{
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
欢迎加入我的编程交流群 829810543