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() { }