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 allimage_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 allimage_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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ 死信队列

在MQ中,当消息成为死信(Dead message)后,消息中间件可以将其从当前队列发送到另一个队列中,这个队列就是死信队列。而在RabbitMQ中,由于有交换机的概念,实际是将死信发送给了死信交换机&#xf…

要在CentOS中安装Docker

Docker部署 在CentOS中安装Docker要在CentOS中安装Docker,请按照以下步骤进行操作:启动和校验常用命令查看容器启动容器 配置镜像加速 在CentOS中安装Docker 要在CentOS中安装Docker,请按照以下步骤进行操作: 首先,确…

apache-maven-3.6.3 安装配置教程

链接:https://pan.baidu.com/s/1RkMXipnvac9EKcZyUStfGQ?pwdl32m 提取码:l32m 1. 将 maven 压缩包解压至指定文件夹 2. 配置环境变量 (1)打开此电脑-> 鼠标右键选择属性->点击高级系统设置 (2)点…

软件测试简历这样写,一周能约七个面试

简历到底有多重要? 俗话说:“简历就是你能否进入一家公司的敲门砖”。面试官只有看到一份有质量的简历才会给你一个面试的机会。 很多人都会有这样的问题,为什么我投了那么多简历,都没有接到面试通知?也没有HR和我电…

“菊风Juphoon”邀您莅临11月22-24日CNF南京应急展消防展 | 展位号:115-1

公司简介 菊风依托互联网和电信网音视频融合技术积累,提供智能化的音视频统一通信产品及服务。面向应急管理、消防救援、智慧城市等多个领域,菊风推出适用于全网通的统一通信一体机、统一通信平台。 此外,菊风还提供视频能力平台&#xff0…

JavaScript设计模式之责任链模式

适用场景:一个完整的流程,中间分成多个环节,各个环节之间存在一定的顺序关系,同时中间的环节的个数不一定,可能添加环节,也可能减少环节,只要保证顺序关系就可以。 如下图: ES5写法…

Qt QTableView排序

1.简介 在开发过程中,我们需要通过点击表头来对QTableView或QTreeView等一系列高级视图进行排序操作,以下是进行排序的步骤。 步骤: 首先创建了一个QStandardItemModel对象或者继承QAbstractTableModel类作为数据模型,并设置了…

如何实现Word文档中的书签双向定位

工作中,经常需要拟定合同,一般都有固定的模板,在特定的位置填写内容。通过zOffice编辑合同文件时,可以在模板需要填写的位置预设书签,配合zOffice SDK使用,利用zOffice书签双向定位的特性,更方便…

4.求1000以内的所有完数

#include<stdio.h> // 完数&#xff1a;一个数的所有的真因子 (即除了自身以外的约数)的和&#xff0c;恰好等于它自身 // 1 不是完数 // 4的因子&#xff1a;1 2 4 除了本身 4 不等于 1&#xff0b;2 所以4不是完数void fun(void){int sum,i,j;for(i2;i<1000;i)…

C语言--结构体(内容超级详细)

一.前言 通过数据类型来定义一个一个的变量,当需要很多相同类型的变量时有数组。基本数据类型在使用时 很方便,但是利用它们来描述现实世界就显得捉襟见肘。例如需要保存一个班学生的信息”姓名,年龄,分 数”,按照前面的学习需要单独定义三个数组,一个保存姓名,一个保存年龄,一…

如何使新手小白编码能力暴涨之Devchat-AI

在这个快速发展的时代&#xff0c;开发者的任务越来越繁重&#xff0c;要求他们快速、高效地完成开发任务。然而&#xff0c;传统的开发方式已经无法满足这个需求。在这种情况下&#xff0c;Devchat的出现给开发者带来了新的帮助。Devchat是一个研发效能分析平台&#xff0c;它…

Java8强大的新特性 —— “Stream API”

一、什么是Stream API&#xff1f; Java Stream API是Java 8中引入的一个重要功能&#xff0c;它允许开发者以声明性方式处理数据集合&#xff0c;使代码更加简洁、可读性更好&#xff0c;同时还提供了并行操作的能力&#xff0c;从而能够更有效地利用多核处理器。 Stream AP…

【达梦数据库】学习笔记

【达梦数据库】学习笔记 【一】如何使用idea连接达梦数据库【二】idea项目导入本地的达梦数据库驱动jar包 【一】如何使用idea连接达梦数据库 &#xff08;1&#xff09;打开idea&#xff0c;点击右上角的数据库 &#xff08;2&#xff09;把达梦数据库的jar包配置一下 找到…

Centos7部署Python3环境

一、安装Python3 ###查看是否安装Python3 Centos 7 默认安装了python 2.7.5. 因为一些命令要用它比如yum 它使用的是python2.7.5 使用 python -V 命令查看一下是否安装Python 然后使用命令 which python 查看一下Python可执行文件的位置 Python指向的是Python2.7 安装依赖 y…

武汉某母婴用品公司 - 集简云连接ERP和营销系统,实现库存管理的自动化

品牌介绍与关怀理念 武汉某母婴用品公司是一家专注于高端孕婴童护理用品的企业&#xff0c;积极响应和关怀孕产人群&#xff0c;全方位提供从待产用品到产后护理用品&#xff0c;再到婴童洗护用品和初生婴儿用品等一系列全面的母婴产品。我们的使命是满足客户的需求&#xff0…

6.判断是不是闰年

#include<stdio.h>void fun(int year){if(year%40&&year%100!0||year%4000)printf("%d 是闰年\n",year);elseprintf("%d 不是闰年\n",year);}int main(){int year;scanf("%d",&year);fun(year);return 0;}

【qemu逃逸】华为云2021-qemu_zzz

前言 虚拟机用户名&#xff1a;root 无密码 设备逆向 经过逆向分析&#xff0c;可得实例结构体大致结构如下&#xff1a; 其中 self 指向的是结构体本身&#xff0c;cpu_physical_memory_rw 就是这个函数的函数指针。arr 应该是 PCI 设备类结构体没啥用&#xff0c;就直接用…

Spring Cloud学习(二)【Eureka注册中心】

文章目录 Eureka 注册中心Eureka 的作用 动手实践搭建 EurekaServer服务注册服务发现 Ribbon 负载均衡负载均衡原理IRule 接口&#xff08;负载均衡策略&#xff09;饥饿加载 Eureka 注册中心 服务调用出现的问题 不能采用硬编码服务消费者该如何获取服务提供者的地址信息&am…

数据库数据迁移常见方式

数据库数据迁移常见方式 数据库数据迁移常见方式1、通过sql2、通过数据迁移工具3、云服务进行数据迁移什么是DRS服务如何使用DRS服务DRS云服务可以干什么 数据库数据迁移常见方式 1、通过sql 批量导入sql insert into tableName select * 2、通过数据迁移工具 在数据库里面…

分支限界法求解迷宫问题

问题描述 从入口出发&#xff0c;按某一方向向前探索&#xff0c;若能走通(未走过的&#xff09;&#xff0c;即某处可以到达&#xff0c;则到达新点&#xff0c;否则试探下一方向&#xff1b;若该点所有的方向均没有通路&#xff0c;则沿原路返回到前一点&#xff0c;换下一个…