QT实现的一个MVP设计模式demo

最近做qt 项目,发现网上基于MVP设计模式的QT例程很少,这里写一个demo示例可作为参考:

一、简要概述

MVP是由MVC发展而来,总体目的与作用相同。都是为了软件构架有层次之分,使得核心逻辑、界面控制、数据这三者分层清晰明了。减少了三者之间的逻辑耦合与功能耦合。也是的代码清晰易读。从而减少因写代码造成的bug。也增加了软件整体的稳定性。

二、代码实现

Interface接口:

interface.h文件


class Interface {
  public:
    virtual ~Interface() {};
    virtual void update_image(const std::string path) = 0;
    virtual void update_message(const std::string data) = 0;
};
model类:

model.h文件

class Model
{
public:
    explicit Model(Interface *i = 0);
    std::string get_data();
public:
    void run();
    void work();

private:
    std::string image_path;
    std::string data;
    Interface *m_interface; 
};

model.cpp文件

Model::Model(Interface *i) : m_interface(i)
{
    image_path = "D:/WorkSpace/QT/MvpTest/";
    data = "Hello MVP!!!";

    //启动一个线程
    run();
}

std::string Model::get_data()
{
    return data;
}

static int count = 0;
void Model::work()
{
    while (1) {
        sleep(1);
        time_t result = time(NULL);
        data = std::to_string(result);
        if(count++ % 5 == 0)
        {
            m_interface->update_message("Auto:"+data);  //更新界面显示
            if(count % 2 == 0) {
                m_interface->update_image(image_path+"picture_normal.jpg");
            }
            else{
                m_interface->update_image(image_path+"picture_blue.jpg");
            }
        }
    }
}

void Model::run()
{
    std::thread work_thread(std::bind(&Model::work, this));
    work_thread.detach();
}
view类:

view.h文件

class View : public QWidget
{
    Q_OBJECT
public:
    explicit View(QWidget *parent = nullptr);

    void updateImage(const QString& path);
    void updateMessage(const QString& message);

signals:
    void buttonClicked();

private:
    QLabel label;
    QLabel image_label;
    QPushButton button;
};

view.cpp文件

View::View(QWidget *parent) : QWidget(parent)
{
    this->resize(800,600);  //设置窗口大小

    //设置背景色
    QPalette palette(this->palette());
    palette.setColor(QPalette::Background, Qt::lightGray);
    this->setPalette(palette);

    // 创建一个QFont对象,设置字体
    label.setFont(QFont("微软雅黑",42,QFont::Bold));
    // 设置对齐方式为居中对齐
    label.setAlignment(Qt::AlignCenter);
    // 设置文本内容
    label.setText("Hello MVP!");

    // 显示图片
    image_label.setScaledContents(true); //show all
    image_label.setPixmap(QPixmap("D:/WorkSpace/QT/MvpTest/picture_normal.jpg"));

    //设置按钮内容
    button.setText("Click me!");
    button.setStyleSheet("QPushButton { background-color: white; color: black; }");
    button.resize(50,30);

    //排版
    QVBoxLayout* layout = new QVBoxLayout(this);
    layout->addWidget(&label);
    layout->addWidget(&image_label);
    layout->addWidget(&button);

    connect(&button, &QPushButton::clicked, this, &View::buttonClicked);
}

void View::updateImage(const QString& path)
{
    image_label.setScaledContents(true); //show all
    image_label.setPixmap(QPixmap(path));
}

void View::updateMessage(const QString& message)
{
    label.setText(message);
}
presenter类:

presenter.h文件

class Presenter : public QObject, public Interface
{
    Q_OBJECT
public:
    explicit Presenter(QObject *parent = nullptr);
    ~Presenter() override;
    void showView();
    //接口函数
    void update_image(const std::string path) override;
    void update_message(const std::string data) override;

public slots:
    void onButtonClicked();

private:
    Model *model = new Model(this);
    View view;
};

presenter.cpp文件

Presenter::Presenter(QObject *parent) : QObject(parent)
{
    //绑定按键指令和按键动作
    connect(&view, &View::buttonClicked, this, &Presenter::onButtonClicked);
}

Presenter::~Presenter()
{
    delete model;
}

void Presenter::showView()
{
    view.show();
}

/*
 * 通过信号和槽的方式,响应view层的按键指令,更新界面显示
 */
void Presenter::onButtonClicked()
{
    view.updateMessage(QString::fromStdString(model->get_data()));
}

/*
 * 通过接口的方式被model层调用,用于更新显示图片
 */
void Presenter::update_image(const std::string path)
{
    printf("path:%s\n",path.c_str());
    view.updateImage(QString::fromStdString(path));
}

/*
 * 通过接口的方式被model层调用,用于更新显示消息
 */
void Presenter::update_message(const std::string data)
{
    printf("data:%s\n",data.c_str());
    view.updateMessage(QString::fromStdString(data));
}

三、使用demo

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Presenter presenter;
    presenter.showView();

    return a.exec();
}

四、代码下载

GitHub - GitHubLuGeng/MVP_Demo: 基于QT实现的一个MVP架构demo,欢迎 star or fork!

这种方式是最典型的mvp设计模式实现,但是当接口越来越多的时候,presenter会越来越大,还有一种变种mvp设计模式,只使用model + View + Interface的方式,每次新增接口只需要在Interface中增加对应接口的虚函数即可:

https://download.csdn.net/download/lu_linux/88507037

 

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

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

相关文章

CentOS/RHEL7环境下更改网卡名称为CentOS6的传统命名规则

图片 CentOS/RHEL7网卡命名规则介绍 图片 传统的Linux服务器网卡的名称命名方式是从eth0,eth1,eth2....这种方式命名的,但是这个编号往往不一定准确对应网卡接口的物理顺序,常规模式下我们使用的服务器设备可能只有一张网卡,若网卡较多的情…

SpringCloud 微服务全栈体系(十二)

第十一章 分布式搜索引擎 elasticsearch 一、初识 elasticsearch 1. 了解 ES 1.1 elasticsearch 的作用 elasticsearch 是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在 GitHub 搜…

新能源汽车高压线束是如何快速连接到测试设备上进行电性能测试的

快速连接形成稳定的电测试在新能源行业里面是很常见的测试场景,比如说在新能源汽车行业的电池包、电机、电控制器的电性能测试中会有很多高压线束,需要将这些线束和电池包、电控制器、电机与测试设备快速连接在一起进行相关的EOL/DCR测试。 新能源汽车高…

UML/SysML建模工具更新(2023.10)(1)StarUML、Software Ideas Modeler

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本:Software Ideas Modeler 14.02 更新时间:2023年10月9日 工具简介 轻量级建模工具,支持UML、BPMN、SysML。 平台:Windo…

如何在搜索引擎中应用AI大语言模型,提高企业生产力?

人工智能尤其是大型语言模型的应用,重塑了我们与信息交互的方式,也为企业带来了重大的变革。将基于大模型的检索增强生成(RAG)集成到业务实践中,不仅是一种趋势,更是一种必要。它有助于实现数据驱动型决策&…

如何做好测试管理岗?深度分析职业规划

经常就有同学说:我以后要做管理岗!其实对于很多刚入行的同学,可能说这句话的时候并没有真正理解管理岗需要做什么事,以及需要具备什么样的技能。所以,作为资深测试经理,我来跟大家分享一下管理岗需要具备的…

了解web3,什么是web3

Web3是指下一代互联网,它基于区块链技术,将各种在线活动更加安全、透明和去中心化。Web3是一个广义的概念,它包括了很多方面,如数字货币、去中心化应用、智能合约等等。听不懂且大多数人听到这个东西,直觉感觉就像骗子…

SpringBoot整合Mybatis-plus代码生成器

整合代码生成器过程中,发现好多博主提供的无法使用,自己整合了一套,没有花里胡哨,直接可用 备注:常规的依赖自己导入,提供的这套,默认已经导入了mybatis-plus,srpingboot等依赖了. 1.maven依赖导入,版本号要与自己的版本号想同 <!--代码生成器依赖--><dependency>…

python基础(Python高级特性(切片、列表生成式)、字符串的正则表达式、函数、模块、Python常用内置函数、错误处理)培训讲义

文章目录 1. Python高级特性&#xff08;切片、列表生成式&#xff09;a) 切片的概念、列表/元组/字符串的切片切片的概念列表切片基本索引简单切片超出有效索引范围缺省 扩展切片step为正数step为负数 b) 列表生成式以及使用列表生成式需要注意的地方概念举例说明1. 生成一个列…

数据结构:AVL树的旋转(平衡搜索二叉树)

1、AVL树简介 AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1&#xff0c;所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&#xff0c;他们…

双11购物节想入手一款音画好的智能电视,大家推荐一下吧?

智能家电更新太快,不想三五年后就淘汰,那就入手东芝电视Z700吧,Z700这次把观影体验和音箱效果做到哇塞,既然要享受生活那就要享受高品质的体验。东芝电视拥有70余年的原色调校技术,每款产品都有专属的日本调校工程师匠心打造,可以真实还原画面色彩,而且还有火箭炮音响系统,也是…

C++ 图解二叉树非递归后序 + 实战力扣题

145.二叉树的后序遍历 145. 二叉树的后序遍历 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> vec;if(root NULL) return vec;TreeNode* guard root…

大型企业是否有必要进行数字化转型?_数据治理平台_光点科技

数字化转型是大型企业在现代商业环境中保持竞争力的关键。一开始我们要明确数字化转型指的是利用数字技术来改变企业的业务模式和企业文化&#xff0c;以提高效率和效益。对于大型企业而言&#xff0c;进行数字化转型有着多重必要性。 1.数字化转型可以帮助企业优化内部流程&am…

记一次经典SQL双写绕过题目[极客大挑战 2019]BabySQL 1

题目环境&#xff1a; 作者已经描述进行了严格的过滤 做好心理准备进行迎接 判断注入类型 admin 1’ 字符型注入万能密码注入 admin 1’ or ‘1’1 报错 已经是字符型注入了&#xff0c;所以的话只有or这里存在了过滤 联想到buuctf里面还没有碰到双写绕过的题目 所以这里斗胆试…

ESXi配置两个不同网段虚拟机互通

ESXi配置两个不同网段虚拟机互通 拓扑图&#xff1a; 步骤 在ESXi上新建一个虚拟交换机新建两个端口组&#xff0c;VLAN ID分别为30和31&#xff0c;添加到新建的虚拟交换机上创建两个虚拟机&#xff0c;网络适配器分别使用新建的端口组30和31对新建的虚拟机配置IP在物理交换…

【计算机组成】实模式/保护模式下地址分段(基段地址+偏移地址)的原因

一.硬编码/静态重定向 我们先来观察下没有地址分段时代CPU是怎么和内存们打交道&#xff0c;在8086CPU以前的老大哥们&#xff0c;访问内存时通常就是实打实的“指哪打哪”&#xff0c;程序指定要放在哪个地址&#xff0c;那就老老实实地放在哪个地址&#xff0c;比如程序A要放…

微信小程序案例3-1 比较数字

文章目录 一、运行效果二、知识储备&#xff08;一&#xff09;Page()函数&#xff08;二&#xff09;数据绑定&#xff08;三&#xff09;事件绑定&#xff08;四&#xff09;事件对象&#xff08;五&#xff09;this关键字&#xff08;六&#xff09;setData()方法&#xff0…

Azure 机器学习 - 设置 AutoML 训练时序预测模型

目录 一、环境准备二、训练和验证数据三、配置试验支持的模型配置设置特征化步骤自定义特征化 四、可选配置频率和目标数据聚合启用深度学习目标滚动窗口聚合短时序处理非稳定时序检测和处理 五、运行试验六、用最佳模型进行预测用滚动预测评估模型精度预测未来 七、大规模预测…

《深入立即计算机系统》书籍学习笔记 - 第二课 - 位,字节和整型

Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型 文章目录 Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型Byte 字节位操作布尔代数集合的表现形式和操作C语言的逻辑操作 位移操作整型数值范围无符号与有符号数值无符号与有符号在C中 拓展和截断拓…

安防监控EasyCVR视频汇聚平台使用海康SDK播放时,画面播放缓慢该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、…