• 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();
    }
  • 相关阅读:
    四则运算(判断正误)
    Right-BICEP要求四则2的测试用例
    《构建之法》阅读笔记02
    第二周的学习进度
    四则运算(升级)
    构建之法阅读笔记01
    新手安装使用codeblocks
    新的一年你该如何起飞
    中国国家图书馆 注册后可以免费使用 维普等多个数据库资源
    c++学籍管理系统v1.10
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/12255968.html
Copyright © 2020-2023  润新知