Qt学习之路 (三)多个窗口之间的互相切换

使用按钮的话要在头文件包含#include , 通过QPushButton类创建一个对象,通过调用这个类的方法来设置按钮的属性

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

#include<QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QPushButton my_button;
    my_button.setText("qinyifei");     //设置按钮上面的文字
    my_button.show();  //按钮创建完成以后要show,不然的话按钮将无法出现
    return a.exec();
}

运行结果
在这里插入图片描述
按钮的确出来了,但是不是在主窗口中,原因是因为子窗口没有指定父类
有两种方式可以指定父类
1. QPushButton my_button(&w); 2. my_button.setParent(&w);

首先我们要创立两个窗口,然后发送信号让他们通信
建立窗口 1

#include "mainwindow.h"
#include<QPushButton>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{
    this->setWindowTitle("boss");     //设置主窗口的标题
    this->resize( QSize( 800, 600 ));// 初始化窗口的大小
    b1.setParent(this);
    b1.setText("A");//设置按钮上的文字
   b1.setGeometry(100,100,50,20);//设置按钮的坐标以及大小,前两个参数为坐标,后两个参数为按钮的大小
}

建立窗口 2
要在项目那里添加class类
在这里插入图片描述
在这里插入图片描述
要继承Qwidget类
在这里插入图片描述
在新增的类的.cpp中创建新的窗口

#include "subwidge.h"
#include <QPushButton>
subwidge::subwidge(QWidget *parent) : QWidget(parent)
{
     this->resize( QSize( 800, 600 ));// init adjust my size of window
    this->setWindowTitle("didi");
    b_s.setParent(this);
    b_s.setText("to boss");
    
 }

虽然两个窗口都已经创建成功了,但是这两个窗口之间没有联系,不能进行通信,并没有意义

在主窗口设置按钮的跳转的槽

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

其中 change_win函数的函数体为


void MainWindow::change_win()
{

    w.show();//设置子窗口显示

    this->hide();//本窗口隐藏
}


w的定义在mainwindow.h中,包含我们刚才创立的窗口的头文件,然后进行定义

 subwidge w;

这样我们就在主窗口中包含了子窗口类型的变量,也就是有了 “联系”
此时我们已经可以在主窗口中切换的子窗口,但是点击子窗口中的按钮并不会切换到主窗口,原因是
子窗口中没有包含主窗口中的变量,没有形成“联系”,这要怎么办呢?
这里使用signal,点击子窗口中的按钮时候将会向本窗口中发送一个信号
在主窗口中我们将这个信号捕捉到,然后处理就可以实现 **“交流”**了

信号的定义和普通函数一样,只不过要属性要设置为signal

     void my_signal();

点击子窗口时候触发函数my_solt

connect(&b_s,&QPushButton::clicked,this,&subwidge::my_solt);


void subwidge::my_solt()
{
       emit my_signal();
}

这样我们就可以在主窗口中捕捉到这个信号了

完整代码如下:
.pro文件

#-------------------------------------------------
#
# Project created by QtCreator 2020-12-04T13:24:38
#
# from Mr.qin yifei
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = q
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    subwidge.cpp

HEADERS  += mainwindow.h \
    subwidge.h

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 my_solt();
    void change_win();
    void deal_sub();


    ~MainWindow();
private:
    QPushButton b1;
    QPushButton *b2;
    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 = 0);

    void my_solt();

signals:

     void my_signal();

public slots:



private:
    QPushButton b_s;
};

#endif // SUBWIDGE_H

main.cpp

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    w.show();

    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include<QPushButton>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{
    this->setWindowTitle("boss");
    this->resize( QSize( 800, 600 ));// init adjust my size of window
    b1.setParent(this);
    b1.setText("A");
   b1.setGeometry(100,100,50,20);

   b2=new QPushButton(this);
   b2->setText("B");


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

   connect(&w,&subwidge::my_signal,this,&MainWindow::deal_sub);
   w.show();

}


void MainWindow::deal_sub()
{
    this->show();

    w.hide();
}

void MainWindow::change_win()
{

    w.show();

    this->hide();
}



void MainWindow::my_solt()
{
    b2->setGeometry(200,200,50,20);
}

MainWindow::~MainWindow()
{

}

subwidge.cpp

#include "subwidge.h"
#include <QPushButton>
subwidge::subwidge(QWidget *parent) : QWidget(parent)
{
     this->resize( QSize( 800, 600 ));// init adjust my size of window
    this->setWindowTitle("didi");
    b_s.setParent(this);
    b_s.setText("to boss");
    connect(&b_s,&QPushButton::clicked,this,&subwidge::my_solt);
}


void subwidge::my_solt()
{
       emit my_signal();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值