Qt C++自定义信号------一例双窗口案例

创建自定义项目的方式 https://www.cnblogs.com/saintdingspage/p/12252169.html

实验环境: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();
}

 

posted @ 2020-02-03 15:46  saintdingtheGreat  阅读(577)  评论(0编辑  收藏  举报