本文主要说明:在主窗口切换至子窗口时,在主窗口创建了子窗口的实例对象,相当于子窗口包含在主窗口,但当主窗口切换至子窗口后就无法实现返回到主窗口的问题.
要想从主窗口切换至子窗口后能够返回或者显示主窗口界面:
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);