编程语言
首页 > 编程语言> > Qt C++自定义信号------一例双窗口案例

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

作者:互联网

实验环境:linux mint下 Qt5.11 C++

功能介绍:主窗口(mywidget)----“昌仔和我的小屋”,子窗口(houerli)----“大家好,我是哇咔嘛咔猴儿”

主窗口

 

 

 子窗口

 

 

 这里介绍两个关键信号功能的实现:

因为这些操作涉及两个窗口间的信号通信,响应

总体设计思想:

对于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
#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上再定义一个子窗体上的按钮类变量,无疑是类设计实现上的一个噩梦!)

综上所述,我们的思路变得清晰起来:子窗体上的按钮,作为触发子窗体向父窗体发送信号的“扳机”

#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)如何处理信号

#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;
};
connect(&hwindow,&houerli::signaltocpc,this,&mywidget::recvsignal);
void mywidget::recvsignal()
{
    hwindow.close();
    this->show();
}

 

 

整体代码

项目文件目録结构

 

 

#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();
}


void  houerli::letparentappear()
{
    resize(300,200);
    emit parentappear();
}
#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
#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();
}

 

标签:Qt,自定义,void,C++,houerli,窗体,QPushButton,mywidget,include
来源: https://www.cnblogs.com/saintdingspage/p/12255968.html