QT学习之两个窗口切换显示
实现效果
- 实现效果
- 代码(含注释)
- main.cpp
- QtsAp.h
- QtsAp.cpp
- sm.h
- sm.cpp
从窗口1(父窗口)切换到窗口2(子窗口),从窗口2(子窗口)切换到窗口1(父窗口)。
#include "QtsAp.h"
#include //没有.h
#include //按钮
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //应用程序类的对象,只有一个
//窗口
QtsAp w; //QtsAp是一个窗口基类,继承自窗口基类QWidget w是类的对象化,是一个窗口
w.show(); //窗口是默认隐藏的,show就显示出来了
return a.exec(); //让程序一直执行等待用户操作,等待事件发生
}
QtsAp.h
#pragma once
#include
#include "ui_QtsAp.h"
#include "sm.h" //包含窗口2
#include //按钮
class QtsAp : public QWidget //类名和头文件名一样
{
Q_OBJECT //与信号和槽有关
public:
//头文件类里的函数在.cpp中要有定义才行,这俩都是函数,构造函数和析构函数
QtsAp(QWidget *parent = Q_NULLPTR);
~QtsAp();
//一些槽函数
void myslot();
void changewin();
void dealsm();
private:
Ui::QtsApClass ui;
QPushButton b1;
QPushButton *b2;
QPushButton b3;
sm w; //在窗口1里面实例化窗口2,2是1的子窗口,也就是一个控件,和上面那些按钮一样,只是它没有固定到1上面而已,
//这些控件的设置和连接关系都是放在构造函数里面了
};
QtsAp.cpp
#include "QtsAp.h"
#include //按钮
QtsAp::QtsAp(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
b1.setParent(this);
b1.setText(QStringLiteral(" 关闭"));
b1.move(100, 100);
b2 = new QPushButton(this); //指针需要分配空间,new
b2->setText(QStringLiteral(" 按钮2"));
//信号和槽的连接函数
connect(&b1, &QPushButton::pressed, this, &QtsAp::close);
//&b1信号发出者
//&QPushButton::pressed发出的信号 QPushButton发出者的类 ::信号名字
//this 信号接收者
//&QtsAp::close做出的处理 QtsAp接收者的类::槽函数名字
//自定义槽 槽没有返回值 信号也没有返回值
connect(b2, &QPushButton::released, this, &QtsAp::myslot); //b2是指针了,所以别&b2 ,否则会错 myslot别加括号
connect(b2, &QPushButton::clicked, &b1, &QPushButton::hide); // hide 隐藏按钮
/* pressed():鼠标按下时触发。对应的函数是 mousePressEvent()。
clicked():鼠标松开时触发。如果鼠标拖拽到按钮区域之外释放则不会触发。对应的函数是 mouseReleaseEvent()。一般情况下 connect 槽函数时使用该信号。,我需要这个应该
released():鼠标松开时触发。即使鼠标拖拽到按钮区域之外释放也会触发。对应的函数是 mouseReleaseEvent()。*/
setWindowTitle(QStringLiteral(" 窗口1号"));
//或者使用 this->setWindowTitle(QStringLiteral(" 窗口1号"));
b3.setParent(this);
b3.setText(QStringLiteral(" 切换到窗口2"));
b3.move(50, 50);
//w.show();//没有指定父对象的成员就要单独显示把 感觉这只是个大一点的按钮啊,
connect(&b3, &QPushButton::clicked, this, &QtsAp::changewin);
//处理子窗口2的信号
connect(&w, &sm::mysignal, this, &QtsAp::dealsm); //子窗口2不能直接命令窗口1显示,需要发送信号,然后窗口1接收信号
this->resize(400, 300);
}
void QtsAp::myslot()
{
b2->setText(QStringLiteral(" 改变"));
}
void QtsAp::dealsm()
{
//子窗口也就是窗口2隐藏
w.hide();
//窗口1显示
this->show();
}
void QtsAp::changewin()
{
//窗口2显示 怪不得叫把窗口2叫子窗口,可以把他看成1的子控件
w.show();//没有指定父对象的成员就要单独显示把 感觉这只是个大一点的按钮啊,
//本窗口隐藏
this->hide();
}
QtsAp::~QtsAp()
{
}
sm.h
#include
#include "ui_sm.h"
#include //按钮
class sm : public QWidget //类名和头文件名一样
{
Q_OBJECT //与信号和槽有关
public:
//头文件类里的函数在.cpp中要有定义才行,这俩都是函数,构造函数和析构函数
sm(QWidget* parent = Q_NULLPTR);
~sm();
void sendslot();
signals: //信号必须由这个关键字来声明 信号没有返回值void 信号就是函数的声明,只需声明无需定义 使用:emit mysignal;
void mysignal();
private:
QPushButton b;
/* Ui::smclass ui;*/ //我以为这里也要和Ui::QtsApClass ui;一样写一下,结果发现报错了,看了别人的代码,好像不写也没事啊
};
sm.cpp
#include "sm.h"
#include //按钮
sm::sm(QWidget* parent)
: QWidget(parent)
{
this->setWindowTitle(QStringLiteral(" 窗口2号"));
b.setParent(this);
b.setText(QStringLiteral(" 切换到窗口1号"));
connect(&b, &QPushButton::clicked, this, &sm::sendslot);
this->resize(400,300);
}
void sm::sendslot()
{
emit mysignal(); //点击子窗口的按钮后,广播这个信号
}
sm::~sm()
{
}