Qt创建 简单的窗口跳转代码 (first 跳转到second; second跳转到first )

4 篇文章 0 订阅

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁金金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值