Design patterns--代理模式

设计模式之代理模式


我们使用Qt开发大型应用程序时,经常遇见大型程序启动时需要加载一些配置信息、用户末次操作信息,以及算法模型等数据时比较费时,笔者在程序启动时设计欢迎页或加载页等窗体来提示用户程序正在加载某些数据,加载界面运行的时候使用代理模式去读取程序运行所需的数据。

  • 效果演示

在这里插入图片描述

  • 代码
#ifndef CONFIGUREBRIDGE_H
#define CONFIGUREBRIDGE_H

#include <QObject>

#pragma pack(push)
#pragma pack(1)
typedef struct s_DataBaseInfo
{
    QString _ip;
    qint16 _port;
    QString _userName;
    QString _pwd;
    QString _dbName;
    qint32 _saveMark;
    qint32 _logMark;

}DataBaseInfo;
#pragma pack(pop)

class ConfigureBridge : public QObject
{
    Q_OBJECT
public:
    static ConfigureBridge *Instance();
    static void Destroy();
private:
    explicit ConfigureBridge(QObject *parent = nullptr);
    ConfigureBridge(const ConfigureBridge &);
    ConfigureBridge &operator=(const ConfigureBridge &);
    ~ConfigureBridge();

private:
    static ConfigureBridge* _instance;

signals:

public:
    DataBaseInfo g_DBInfo;
};

Q_DECLARE_METATYPE(DataBaseInfo)

#endif // CONFIGUREBRIDGE_H

//-----------------------------
#include "configurebridge.h"

ConfigureBridge* ConfigureBridge::_instance = nullptr;

ConfigureBridge *ConfigureBridge::Instance()
{
    if(_instance == nullptr)
    {
        _instance = new ConfigureBridge();
    }
    return _instance;
}

void ConfigureBridge::Destroy()
{
    if(_instance != nullptr)
    {
        delete _instance;
        _instance = nullptr;
    }
}

ConfigureBridge::ConfigureBridge(QObject *parent) : QObject(parent)
{

}

ConfigureBridge::ConfigureBridge(const ConfigureBridge &)
{

}

ConfigureBridge &ConfigureBridge::operator=(const ConfigureBridge &)
{

}

ConfigureBridge::~ConfigureBridge()
{

}
#ifndef LOADDATA_H
#define LOADDATA_H

#include <QObject>
#include <QFile>
#include <QXmlStreamReader>

// 系统配置文件XML
class ReadXml : public QObject
{
    Q_OBJECT
public:
    explicit ReadXml(QObject *parent = nullptr);

    void readSysCfg();
};

class OP_Subject
{

public:
    virtual void readOperatePointsData() = 0;
};

// 工况点数据Dat
class LoadData : public QObject, public OP_Subject
{
    Q_OBJECT
public:
    explicit LoadData(QObject *parent = nullptr);

    void readOperatePointsData() override;
signals:

};

class OP_Proxy : public QObject, public OP_Subject
{
    Q_OBJECT
public:
    explicit OP_Proxy(QObject *parent = nullptr);

    void readOperatePointsData() override;

private:
    LoadData* m_loadData;
};

#endif // LOADDATA_H

//--------------------------------
#include "loaddata.h"
#include <QDataStream>
#include <QDebug>
#include <QTextCodec>
#include <unistd.h>
#include "configurebridge.h"

ReadXml::ReadXml(QObject *parent) : QObject(parent)
{

}

void ReadXml::readSysCfg()
{
    printf("[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);
    QFile file("system_config.xml");
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return;
    }

    QXmlStreamReader xmlReader(&file);
    if(xmlReader.hasError())
    {
        qDebug() << "XML error: " << xmlReader.errorString();
        return;
    }

    while (!xmlReader.atEnd() && !xmlReader.hasError())
    {
        xmlReader.readNext();
        if(xmlReader.isStartElement())
        {
            // qDebug() << xmlReader.name().toString();
            if(xmlReader.name().toString() == "ip")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._ip = item;
            }
            else if(xmlReader.name().toString() == "port")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._port = item.toUInt();
            }
            else if(xmlReader.name().toString() == "username")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._userName = item;
            }
            else if(xmlReader.name().toString() == "pwd")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._pwd = item;
            }
            else if(xmlReader.name().toString() == "dbname")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._dbName = item;
            }
            else if(xmlReader.name().toString() == "save_mark")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._saveMark = item.toInt();
            }
            else if(xmlReader.name().toString() == "log_mark")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._logMark = item.toInt();
            }
        }
        else if(xmlReader.isEndElement())
        {
            // qDebug() << "==End==";
        }
        else if(xmlReader.isCharacters() && !xmlReader.isWhitespace())
        {
            // qDebug() << xmlReader.text().toString();
        }
    }

    file.close();
}

LoadData::LoadData(QObject *parent) : QObject(parent)
{

}

void LoadData::readOperatePointsData()
{
    printf("[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);
    sleep(2);
    QFile file("op_info.dat");
    if(!file.open(QIODevice::ReadOnly))
    {
        return;
    }

    QString strBinary;
    QTextCodec* codec = QTextCodec::codecForName("UTF-8");
    QDataStream dataStream(&file);
    while (!dataStream.atEnd())
    {
        QByteArray tmpLine = file.readLine();
        strBinary += codec->toUnicode(tmpLine.trimmed());
    }
    file.close();

    qDebug() << strBinary;

    sleep(2);
    qDebug() << "Data loading completed ^_^";
}


OP_Proxy::OP_Proxy(QObject *parent) : QObject(parent)
{
    m_loadData = nullptr;
}

void OP_Proxy::readOperatePointsData()
{
    printf("[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);
    if(m_loadData == nullptr)
    {
        m_loadData = new LoadData();
    }

    m_loadData->readOperatePointsData();
}
#ifndef SYSTEMCONFIG_H
#define SYSTEMCONFIG_H

#include <QObject>
#include "welcomefrm.h"
#include "loaddata.h"

/**
 * 1、加载系统配置信息
 * 2、加载工况点数据
 */

class SystemConfig : public QObject
{
    Q_OBJECT
public:
    explicit SystemConfig(QObject *parent = nullptr);

    void read_system_config();
    void closeWelPage();

signals:

private:
    WelcomeFrm* m_welFrm;
    ReadXml* m_readXmlCfg;
    OP_Proxy* m_opProxy;
};

#endif // SYSTEMCONFIG_H

//--------------------------------------
#include "systemconfig.h"
#include <QCoreApplication>

SystemConfig::SystemConfig(QObject *parent) : QObject(parent)
{
    m_welFrm = new WelcomeFrm();
    m_readXmlCfg = new ReadXml(this);
    m_opProxy = new OP_Proxy(this);
}

void SystemConfig::read_system_config()
{
    m_welFrm->show();
    QCoreApplication::processEvents();

    m_readXmlCfg->readSysCfg();
    m_opProxy->readOperatePointsData();
}

void SystemConfig::closeWelPage()
{
    m_welFrm->hide();
    m_welFrm->deleteLater();
    m_welFrm = nullptr;
}
#ifndef WELCOMEFRM_H
#define WELCOMEFRM_H

#include <QWidget>

namespace Ui {
class WelcomeFrm;
}

class WelcomeFrm : public QWidget
{
    Q_OBJECT

public:
    explicit WelcomeFrm(QWidget *parent = nullptr);
    ~WelcomeFrm();

    void initSystemCfg();

private:
    Ui::WelcomeFrm *ui;
};

#endif // WELCOMEFRM_H

//------------------------------------
#include "welcomefrm.h"
#include "ui_welcomefrm.h"
#include <QPalette>
#include <QPixmap>

WelcomeFrm::WelcomeFrm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::WelcomeFrm)
{
    ui->setupUi(this);
    //去掉窗口边框
    this->setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);

    QPalette pal = this->palette();
    pal.setBrush(QPalette::Background, QBrush(QPixmap(":/res/welcome.jpg")));
    setPalette(pal);

    ui->label->setStyleSheet("QLabel{color: rgb(255,0,255);"
                             "border: 1px solid green; border-radius: 2px;"
                             "font-size: 30px; font-weight:bold;}");

    ui->label->setText("数据加载中...");

    printf("[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);
}

WelcomeFrm::~WelcomeFrm()
{
    delete ui;
}

void WelcomeFrm::initSystemCfg()
{
}
#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWidget; }
QT_END_NAMESPACE

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();

private:
    Ui::MainWidget *ui;
};
#endif // MAINWIDGET_H

//--------------------------------
#include "mainwidget.h"
#include "ui_mainwidget.h"
#include "configurebridge.h"
#include <QDebug>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);
    ui->textEdit->setReadOnly(true);
    ui->textEdit->setStyleSheet("QTextEdit{background: #033441;"
                                "color:#64eefa;"
                                "border:1px solid #64eefa;"
                                "font-size: 30px;"
                                "font-weight:bold;}");

    ui->textEdit->append(ConfigureBridge::Instance()->g_DBInfo._ip);
    ui->textEdit->append(QString::number(ConfigureBridge::Instance()->g_DBInfo._port));
    ui->textEdit->append(ConfigureBridge::Instance()->g_DBInfo._userName);
    ui->textEdit->append(ConfigureBridge::Instance()->g_DBInfo._pwd);
    ui->textEdit->append(ConfigureBridge::Instance()->g_DBInfo._dbName);
    ui->textEdit->append(QString::number(ConfigureBridge::Instance()->g_DBInfo._saveMark));
    ui->textEdit->append(QString::number(ConfigureBridge::Instance()->g_DBInfo._logMark));
}

MainWidget::~MainWidget()
{
    delete ui;
}
#include <QApplication>
#include <QElapsedTimer>
#include <QMetaType>
#include <unistd.h>
#include "configurebridge.h"
#include "systemconfig.h"
#include "mainwidget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qRegisterMetaType<DataBaseInfo>("DataBaseInfo");

    // 加载系统的配置数据
    SystemConfig sysCfg;
    sysCfg.read_system_config();

    MainWidget w;
    w.show();
    sysCfg.closeWelPage();

    return a.exec();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/237075.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java数据结构 -- 顺序表】

List和ArrayList与顺序表 一. List1.1 List介绍2.1 常见接口介绍3.1 List的使用 二. ArrayList与顺序表1.线性表2.顺序表2.1 接口的实现2.2 顺序表的创建2.3 顺序表的打印2.4 顺序表的插入2.5 顺序表的按索引位置插入数据2.6 判断顺序表是否包含某个数2.7 返回顺序表某个数的索…

谁会成为第一个MoE大模型基座呢?重磅!Mixtral MoE 8x7B!!!

文章目录 谁会成为第一个MoE大模型基座呢&#xff1f;重磅&#xff01;Mixtral MoE 8x7B&#xff01;&#xff01;&#xff01;前言重磅&#xff01;Mixtral MoE 8x7B&#xff01;&#xff01;&#xff01;Mixtral是啥模型介绍模型结构长啥样&#xff1f;表现如何&#xff1f;可…

Python从入门到精通五:Python数据容器

数据容器入门 为什么学习数据容器 思考一个问题&#xff1a;如果我想要在程序中&#xff0c;记录5名学生的信息&#xff0c;如姓名。 如何做呢&#xff1f; 学习数据容器&#xff0c;就是为了批量存储或批量使用多份数据 Python中的数据容器&#xff1a; 一种可以容纳多份…

HCIA-H12-811题目解析(10)

1、【单选题】DHCP客户端在租期到达哪个比例时第一次发送续租报文&#xff1f; 2、【单选题】在WLAN中用于标识无线网络&#xff0c; 区分不同的无线网络的是&#xff1f; 3、【单选题】我们在笔记本电脑上搜索可接入无线网络时&#xff0c;显示出来的网络名称实际是 4、【单…

哪些原因导致MES管理系统实施项目失败

在制造业中&#xff0c;实施MES管理系统是一种提高生产效率、降低成本、提升质量的重要手段。然而&#xff0c;许多MES管理系统实施项目并未取得预期的成功&#xff0c;甚至失败。本文将探讨导致MES管理系统实施项目失败的原因。 1、需求不明确 在MES实施项目中&#xff0c;需…

Java-异常(一)-异常的概述和常见异常的举例

&#x1f436;b站视频 124-异常处理-异常的概述与常见异常的举例_哔哩哔哩_bilibili 目录 b站视频 5.1 异常概念 5.2 Error 示例代码 5.3 Exception异常划分 ❓面试题&#xff1a;常见的异常有哪些&#xff1f;举例说明 &#x1f436;5.1 异常概念 在使用计算机语言进行…

基于SSM的校园心理健康网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

PostGIS学习教程十二:地理

PostGIS学习教程十二&#xff1a;地理 坐标为"地理&#xff08;geographics&#xff09;“形式或者说是” 纬度&#xff08;latitude&#xff09;/经度&#xff08;longitude&#xff09;"形式的数据非常常见。 与Mercator&#xff08;墨卡托&#xff09;、UTM&…

【jitterbuffer】2:OnCompleteFrameCallback 送去FrameBuffer 处理的流程

【jitterbuffer】2:OnCompleteFrameCallback 送去FrameBuffer 处理的流程 基于m98版本。 WebRtc Video Receiver(六)-FrameBuffer原理 大神有个详细的论述。 Finder的FID设计 H.264 没有FID,使用RtpSeqNumOnlyRefFinder ,比较复杂,要做出决定 RtpSeqNumOnlyRefFinder cla…

canvas 有趣的弹簧效果

先上效果 两个小球之间有一根弹簧&#xff0c;这里有一条线表示&#xff0c;其中左球固定&#xff0c;在点击开始后&#xff0c;右球开始做自由落体 思路 先做受力分析 经过受力分析可以发现&#xff0c;整个系统一共有三个力在起作用&#xff0c;我们分别把他们求出来并合成…

鸿蒙原生应用再添新丁!同花顺入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;同花顺入局鸿蒙 来自 HarmonyOS 微博12月11日消息&#xff0c;同花顺已完成#鸿蒙原生应用#beta版本&#xff0c;并正在进行全量版本开发&#xff0c;进一步丰富了#鸿蒙原生应用#的覆盖领域。同花顺作为股民和券商首选的一站式金融理财服务平台…

搜集怎么绘制三维曲线和曲面?

1、针对函数对象是单一变量、两个函数的情况。用plot3函数&#xff1b;&#xff08;三维曲线&#xff09; 看一下matlab官方的例子&#xff1a; t 0:pi/50:10*pi; st sin(t); ct cos(t); plot3(st,ct,t) 绘制出来的曲线&#xff1a; 几个比较关键的点&#xff1a; &…

Linux系统编程(一):基本概念

参考引用 Unix和Linux操作系统有什么区别&#xff1f;一文带你彻底搞懂posix Linux系统编程&#xff08;文章链接汇总&#xff09; 1. Unix 和 Linux 1.1 Unix Unix 操作系统诞生于 1969 年&#xff0c;贝尔实验室发布了一个用 C 语言编写的名为「Unix」的操作系统&#xff0…

nginx中的正则表达式及location和rewrite

目录 常用的Nginx 正则表达式 location和rewrite的区别 location location 大致可以分为三类 location 常用的匹配规则 location 优先级 location 示例说明 location优先级的总结 rewrite rewrite的功能 rewrite实现跳转的条件 rewrite的执行顺序 rewrite的语法格式…

C# 任务的异常和延续处理

写在前面 当Task在执行过程中出现异常或被取消等例外的情况时&#xff0c;为了让执行流程能够继续进行&#xff0c;可以使用延续方法实现这种链式处理&#xff1b;还可以针对前置任务不同的执行结果&#xff0c;选择执行不同的延续分支方法。子任务执行过程中的任何异常都会被…

【收获】成长之路

目录 一、前言二、计算机方面三、专业知识方面四、总结 一、前言 四年&#xff0c;对于一个人的成长来说&#xff0c;是一个相当重要的阶段。在这段时间里&#xff0c;我经历了许多挑战、收获了许多成就&#xff0c;也在不断地成长和改变。回首这四年的点点滴滴&#xff0c;我深…

linux docker 怎么更换镜像源

要设置Docker镜像&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 打开终端并登录到Docker主机上。 运行以下命令来编辑 Docker 的配置文件 "/etc/docker/daemon.json"&#xff08;如果不存在则新建&#xff09;&#xff1a; sudo nano /etc/docker/daemon.js…

Django系列之Celery异步框架+RabbitMQ使用

在Django项目中&#xff0c;如何集成使用Celery框架来完成一些异步任务以及定时任务呢&#xff1f; 1. 安装 pip install celery # celery框架 pip install django-celery-beat # celery定时任务使用 pip install django-celery-results # celery存储结果使用2. Django集成…

URIBuilder与SSRF

在使用一个静态扫描工具时&#xff0c;报了一个SSRF的问题&#xff0c;经过数据流的分析&#xff0c;导致此工具报SSRF的原因是在调用URIBuilder的setPath函数时&#xff0c;参数是从请求里获取的&#xff0c;导致了数据流被污染&#xff0c;因此认为由URIBuilder构造的URL也被…

作为一个产品经理带你了解Axure的安装和基本使用

1.Axure的简介 Axure是一种强大的原型设计工具&#xff0c;它允许用户创建交互式的、高保真度的原型&#xff0c;以及进行用户体验设计和界面设计。Axure可以帮助设计师和产品经理快速创建和共享原型&#xff0c;以便团队成员之间进行沟通和反馈。Axure提供了丰富的交互组件和功…
最新文章