实验环境:linux mint下 Qt5.11 C++
功能介绍:主窗口(mywidget)----“昌仔和我的小屋”,子窗口(houerli)----“大家好,我是哇咔嘛咔猴儿”
主窗口
子窗口
这里介绍两个关键信号功能的实现:
- 点击主窗口的“有请!”按钮打开子窗口,同时主窗口隐藏---简称func1
- 子窗口点击"缩小窗口",子窗口尺寸缩小,主窗口出现----简称func2
因为这些操作涉及两个窗口间的信号通信,响应
总体设计思想:
对于func1:
- 子窗口的打开,由主窗口通过信号控制,这意味着,主窗口类里面的相关成员方法能打开和关闭子窗口,私有属性中包含子窗体类变量
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> #include "houerli.h" class mywidget : public QWidget { Q_OBJECT public: mywidget(QWidget *parent = 0); ~mywidget(); void openthewindow(); private: QPushButton * qb; houerli hwindow; }; #endif // MYWIDGET_H
- 由于是通过按钮(代码里是qb)发送信号给父窗体
#include "mywidget.h" mywidget::mywidget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("昌仔和我的小屋"); this->resize(800,600); qb=new QPushButton(this); qb->setText(QString("有请!")); qb->move(20,20); qb->show(); connect(qb,&QPushButton::released,this,&mywidget::openthewindow); } void mywidget::openthewindow() { hwindow.show(); this->hide(); }
对于func2
相比func1,func2稍微复杂一些,但只要我们能捋清逻辑,绝非难事。
功能上,我们是点击了子窗体上的一个按钮,实现了主窗口显现的效果,看似是按钮发送了新号,实则不然。从主窗体类的代码实现通盘考虑,子窗体类的变量hwindow作为主窗体类mywidget的私有属性出现
从设计实现的角度来看:mywidget来调用类的成员函数处理子窗体类houerli发来的信号,从而实现子窗体变量hwindow的打开和关闭乃为上策,而不是直接跟子窗体上的一个按钮往来什么信号(如果mywidget上再定义一个子窗体上的按钮类变量,无疑是类设计实现上的一个噩梦!)
综上所述,我们的思路变得清晰起来:子窗体上的按钮,作为触发子窗体向父窗体发送信号的“扳机”
- 子窗体类设计的头文件,注意:自定义信号signaltocpc()即为子窗体类houerli向父窗体mywidget发送的信号
#ifndef HOUERLI_H #define HOUERLI_H #include <QWidget> #include <QPushButton> class houerli : public QWidget { Q_OBJECT public: explicit houerli(QWidget *parent = nullptr); void sendsignal(); void letparentappear(); signals: void signaltocpc(); void parentappear(); public slots: private: QPushButton* qbl;//“扳机”按钮 QPushButton* qbl2; }; #endif // HOUERLI_H
- 子窗体类成员函数
#include "houerli.h" #include<QPushButton> houerli::houerli(QWidget *parent) : QWidget(parent) { this->setWindowTitle("大家好,我是哇咔嘛咔猴儿"); this->resize(800,600); qbl=new QPushButton(this); qbl->setText(QString("请落座嘉宾席!")); qbl->move(20,20); qbl->show(); qbl2=new QPushButton(this); qbl2->setText(QString("缩小窗口")); qbl2->move(140,20); qbl2->show(); connect(qbl,&QPushButton::released,this,&houerli::sendsignal);//这里我们依靠了“扳机”按钮,敦促子窗体向父窗体发送了信号 connect(qbl2,&QPushButton::released,this,&houerli::letparentappear); } void houerli::sendsignal() { emit signaltocpc();//发送信号的语法 emit 信号名() } void houerli::letparentappear() { resize(300,200); emit parentappear(); }
接下来,理所应当的,我们要定义主窗体(mywidget)如何处理信号
- mywidget 头文件
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> #include "houerli.h" class mywidget : public QWidget { Q_OBJECT public: mywidget(QWidget *parent = 0); ~mywidget(); void openthewindow(); void recvsignal();//如何处理子窗体发来的信号 void askedforappear(); void closewindow(); private: QPushButton * qb; QPushButton * qb2; houerli hwindow; };
- mywidget与子窗体如何交互
connect(&hwindow,&houerli::signaltocpc,this,&mywidget::recvsignal);
- mywidget成员函数recvsignal()
void mywidget::recvsignal() { hwindow.close(); this->show(); }
整体代码
项目文件目録结构
- houerli.h
#ifndef HOUERLI_H #define HOUERLI_H #include <QWidget> #include <QPushButton> class houerli : public QWidget { Q_OBJECT public: explicit houerli(QWidget *parent = nullptr); void sendsignal(); void letparentappear(); signals: void signaltocpc(); void parentappear(); public slots: private: QPushButton* qbl; QPushButton* qbl2; }; #endif // HOUERLI_H
- houerli.cpp
#include "houerli.h" #include<QPushButton> houerli::houerli(QWidget *parent) : QWidget(parent) { this->setWindowTitle("大家好,我是哇咔嘛咔猴儿"); this->resize(800,600); qbl=new QPushButton(this); qbl->setText(QString("请落座嘉宾席!")); qbl->move(20,20); qbl->show(); qbl2=new QPushButton(this); qbl2->setText(QString("缩小窗口")); qbl2->move(140,20); qbl2->show(); connect(qbl,&QPushButton::released,this,&houerli::sendsignal); connect(qbl2,&QPushButton::released,this,&houerli::letparentappear); } void houerli::sendsignal() { emit signaltocpc(); } void houerli::letparentappear() { resize(300,200); emit parentappear(); }
- mywidget.h
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> #include "houerli.h" class mywidget : public QWidget { Q_OBJECT public: mywidget(QWidget *parent = 0); ~mywidget(); void openthewindow(); void recvsignal(); void askedforappear(); void closewindow(); private: QPushButton * qb; QPushButton * qb2; houerli hwindow; }; #endif // MYWIDGET_H
- mywidget.cpp
#include "mywidget.h" mywidget::mywidget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("昌仔和我的小屋"); this->resize(800,600); qb=new QPushButton(this); qb->setText(QString("有请!")); qb->move(20,20); qb->show(); qb2=new QPushButton(this); qb2->setText(QString("关闭窗口")); qb2->move(120,20); qb2->show(); connect(qb,&QPushButton::released,this,&mywidget::openthewindow); connect(&hwindow,&houerli::signaltocpc,this,&mywidget::recvsignal); connect(&hwindow,&houerli::parentappear,this,&mywidget::askedforappear); connect(qb2,&QPushButton::released,this,&mywidget::closewindow); } void mywidget::askedforappear() { this->show(); } void mywidget::openthewindow() { hwindow.show(); this->hide(); } void mywidget::recvsignal() { hwindow.close(); this->show(); } void mywidget::closewindow() { this->close(); hwindow.close(); } mywidget::~mywidget() { }
- 主函数----基本上就是个总调用
#include "mywidget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); mywidget w; w.show(); return a.exec(); }