QT5:子窗口到主窗口切换问题举例说明

 

本文主要说明:在主窗口切换至子窗口时,在主窗口创建了子窗口的实例对象,相当于子窗口包含在主窗口,但当主窗口切换至子窗口后就无法实现返回到主窗口的问题.

要想从主窗口切换至子窗口后能够返回或者显示主窗口界面:

1.在子窗口定义一个信号

signals:
    void signal_Emit();

2、子窗口内按钮进行点击事件,并让本窗口发出该信号

void subWidget::sendSlot()
{
    emit signal_Emit();
}

3、要是该信号能够发生,由于connect函数的最后一个参数时槽函数,所以子窗口内需要定义一个槽函数用于发射定义的那个信号.

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

这时主窗口需要使用connect函数接收子窗口发出的所定义的信号,并且在主窗口中处理该信号,有需要在主窗口内定义一个槽函数用于专门处理接收到子窗口发送的信号.

 connect(&sub,&subWidget::signal_Emit,this,&MainWidget::dealSub);

 以下是全部代码:

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w;//先执行构造函数   所以一般mainwidget中不需要写东西  将其他功能写在构造函数
    w.show();

    return a.exec();
}
#include <QWidget>
#include <QPushButton>
#include "subwidget.h"


class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    QPushButton b1,*b2,b3;

    subWidget sub;

    void mySlot();
    void myChangeWind();
    void dealSub();

    ~MainWidget();
};

#endif // MAINWIDGET_H

主窗口头文件↑、子窗口头文件↓

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

class subWidget : public QWidget
{
    Q_OBJECT
public:
    explicit subWidget(QWidget *parent = nullptr);
    QPushButton b;

    void sendSlot();

    /*
     * 信号必须由signal关键字声明
     * 信号没有返回值,但可以由参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用:
     *  signal_Emit()
     *
     */


signals:
    void signal_Emit();

public slots:
};

#endif // SUBWIDGET_H

主窗口实现

#include "mainwidget.h"

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("close");
    b1.move(100,100);

    connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
    /*
    &b1: 信号发出者  指针类型
    &Qpushbutton::pressed : 处理的信号  &发送者类型名::信号名
    this  信号接收者
    &MainWidget::close  槽函数, 信号处理函数

    */


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

    /*
     * 使用自定义槽函数  普通函数的用法
     * QT5中  任意的成员函数 普通的全局函数 静态函数
     * 槽函数需要与信号一致(参数 返回值)
     * 由于信号都是没有返回值,所以槽函数一定没有返回值
    */

    connect(b2,&QPushButton::released,this,&MainWidget::mySlot);

    connect(b2,&QPushButton::released,&b1,&QPushButton::hide);


    b3.setText("切换到子窗口");
    b3.setParent(this);
    b3.move(70,0);

    //显示子窗口
   connect(&b3,&QPushButton::pressed,this,&MainWidget::myChangeWind);


   //处理子窗口的信号
   connect(&sub,&subWidget::signal_Emit,this,&MainWidget::dealSub);

     resize(400,300);

}
void MainWidget::dealSub()
{
    sub.hide();
    show();

}


void  MainWidget::myChangeWind()
{
    sub.show();
    this->hide();
}
void MainWidget::mySlot()
{
    b2->setText("好痛啊........!");
}

MainWidget::~MainWidget()
{

}

子窗口实现

#include "subwidget.h"

subWidget::subWidget(QWidget *parent) : QWidget(parent)
{
    b.setText("切换到主窗口!");
    b.setParent(this);
    setWindowTitle("子窗口");
     connect(&b,&QPushButton::pressed,this,&subWidget::sendSlot);

     resize(400,300);
}


void subWidget::sendSlot()
{
    emit signal_Emit();
}

por文件

#-------------------------------------------------
#
# Project created by QtCreator 2020-10-14T12:51:44
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = signalandslot
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwidget.cpp \
    subwidget.cpp

HEADERS += \
        mainwidget.h \
    subwidget.h

 

 

本文主要说明:在主窗口切换至子窗口时,在主窗口创建了子窗口的实例对象,相当于子窗口包含在主窗口,但当主窗口切换至子窗口后就无法实现返回到主窗口的问题.

要想从主窗口切换至子窗口后能够返回或者显示主窗口界面:

1.在子窗口定义一个信号

signals:
    void signal_Emit();

2、子窗口内按钮进行点击事件,并让本窗口发出该信号

void subWidget::sendSlot()
{
    emit signal_Emit();
}

3、要是该信号能够发生,由于connect函数的最后一个参数时槽函数,所以子窗口内需要定义一个槽函数用于发射定义的那个信号.

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

这时主窗口需要使用connect函数接收子窗口发出的所定义的信号,并且在主窗口中处理该信号,有需要在主窗口内定义一个槽函数用于专门处理接收到子窗口发送的信号.

 connect(&sub,&subWidget::signal_Emit,this,&MainWidget::dealSub);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值