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.rhkb.cn/news/182895.html

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

相关文章

Linux实现进度条小程序(包含基础版本和模拟下载过程版本)

Linux实现进度条小程序[包含基础版本和模拟下载过程版本] Linux实现进度条小程序1.预备的两个小知识1.缓冲区1.缓冲区概念的引出2.缓冲区的概念 2.回车与换行1.小例子2.倒计时小程序 2.基础版进度条1.的回车方式的打印2.百分比的打印3.状态提示符的打印 3.升级版进度条1.设计:进…

虚拟机Linux-Centos系统网络配置常用命令+Docker 的常用命令

目录 1、虚拟机Linux-Centos系统网络配置常用命令2、Docker 的常用命令2.1 安装docker步骤命令2.2 在docker容器中安装和运行mysql 2、dockerfile关键字区别(ADD/COPY,CMD/ENTRYPOINT) 1、虚拟机Linux-Centos系统网络配置常用命令 进入网络配置文件目录 cd /etc/sysconfig/ne…

【深度学习】Yolov8 区域计数

git:https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-Region-Counter/readme.md 很长时间没有做yolov的项目了,最近一看yolov8有一个区域计数的功能,不得不说很实用啊。 b站:https://www.bilibili.com/vid…

路由器基础(十二):IPSEC VPN配置

一、IPSec VPN基本知识 完整的IPSec协议由加密、摘要、对称密钥交换、安全协议四个部分组成。 两台路由器要建立IPSecVPN连接,就需要保证各自采用加密、摘要、对称密钥 交换、安全协议的参数一致。但是IPSec协议并没有确保这些参数一致的手段。 同时,IP…

【计算机网络】网络层IP协议

文章目录 1. IP协议介绍2. IP报头3. IP的分片和组装4. IP地址网段划分特殊的IP地址子网、局域网、网段的区别IP地址的数量限制 5. 公网IP和私有IP6. NAT技术7. 路由Route 1. IP协议介绍 IP协议(Internet Protocol)是一种最常用的网络层协议,…

Java —— 类和对象(一)

目录 1. 面向对象的初步认知 1.1 什么是面向对象 1.2 面向对象与面向过程 2. 类定义和使用 2.1 认识类 2.2 类的定义格式 3. 类的实例化(如何产生对象) 3.1 什么是实例化 3.2 访问对象的成员 3.3 类和对象的说明 4. this引用 4.1 为什么要有this引用 4.2 什么是this引用 4.3 th…

从零开始搭建React+TypeScript+webpack开发环境-使用iconfont构建图标库

创建iconfont项目 进入iconfont官网,完成注册流程,即可创建项目。 无法访问iconfont可尝试将电脑dns改为阿里云镜像223.5.5.5和223.6.6.6 添加图标 在图标库里选择图标,加入购物车 将图标添加到之前创建的项目中 生成代码 将代码配置到项目…

【1++的Linux】之线程(一)

👍作者主页:进击的1 🤩 专栏链接:【1的Linux】 文章目录 一,Linux线程概念二,线程的优缺点进程和线程类比现实 三, 线程的操作线程的私有资源 && 线程的创建线程的等待线程终止线程分离…

chromedp库编写程序

步骤1:首先,我们需要导入chromedp库,以便使用它来下载网页内容。 import chromedp 步骤2:然后,我们需要创建一个函数,该函数接受一个URL作为参数,并使用chromedp库下载该URL的内容。 func do…

关于Vue使用props传值遇到的一些问题

一、The data property “tableData” is already declared as a prop. Use prop default value instead. 翻译过来:数据属性“tableData”已声明为prop。请改prop默认值。 将父组件的prop传过去变量改一下 二、prop传值,子组件比父组件先渲染&#…

LV.12 D17 中断控制器 学习笔记

一、中断控制器 在处理IRQ的时候,会将CPSR写入IRQ_SPSR,然后将CPU切换为IRQ模式,把状态改成ARM状态,把I位写成1禁止全部的IRQ,所以中断这样是我们不想要的。4412是一个四核的CPU,在发送中断前要确定发送给哪…

多测师肖sir_高级金牌讲师_jenkins搭建

jenkins操作手册 一、jenkins介绍 1、持续集成(CI) Continuous integration 持续集成 团队开发成员每天都有集成他们的工作,通过每个成员每天至少集成一次,也就意味着一天有可 能多次集成。在工作中我们引入持续集成,通…

0基础2小时搭建自己的网站

​作者主页 📚lovewold少个r博客主页 ⚠️本文重点:0基础2小时搭建个人网站 👉【C-C入门系列专栏】:博客文章专栏传送门 😄每日一言:宁静是一片强大而治愈的神奇海洋! 目录 前言 第一步 环境…

Vue-SplitPane可拖拽分隔面板(随意拖动div)

npm install vue-splitpane一、使用 (1)局部使用: 在vue文件中 import splitPane from vue-splitpane export default {componnets: { splitPane } }(2)全局使用: 在main.js文件注册 import splitPane…

perl列表创建、追加、删除

简介 perl 列表追加元素 主要是通过push和unshift函数来实现。其中,push是追加到列表尾,unshift是追加到列表头。 perl列表删除元素 主要是通过pop和shift函数来实现。其中,pop是从列表尾删除一个元素, shift是从列表头删除一…

【教3妹学编程-算法题】最大单词长度乘积

3妹:哇,今天好冷啊, 不想上班。 2哥:今天气温比昨天低8度,3妹要空厚一点啊。 3妹 : 嗯, 赶紧把我的羽绒服找出来穿上! 2哥:哈哈,那倒还不至于, 不过气温骤降&…

2000-2022年“宽带Z国“试点城市名单匹配数据

2000-2022年“宽带Z国“试点城市名单匹配数据 1、时间:2000-2022年 2、指标:行政区划代码、年份、地区、所属省份、所属地域、试点城市、最早试点年份、DID 3、来源:来自工信部和国家发改委在2014年、2015年和2016年分别遴选的“宽带中国”…

11月起,33个省份纳入数电票开票试点范围内,发票无纸化已是大势所趋!

10月底,北京、贵州、山东(不含青岛市)、湖南、宁夏5个地区相继发布开展数电票试点工作的通知,至此,全国已有33个省份纳入数电票开票试点范围内。根据上述5地区发布的相关公告,11月1日将正式推行“数电票”开…

python之pyQt5实例:几何绘图界面

使用PyQt5设计一个界面,其中点击不同的按钮可以在画布上画出点、直线、圆和样条曲线 from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton,QHBoxLayout,QVBoxLayout,QWidget,QLabel from PyQt5.QtGui import QPainter, QPen, QColor from PyQt5.Q…

PyQt5中QLineEdit、QRadioButton、QComboBox这些小部件的change事件

最近在用PyQt5做项目,总结一下QLineEdit、QRadioButton、QComboBox这些部件用到的change事件绑定,即信号与插槽。 QLineEdit QLineEdit 对象是最常用的输入字段。 它提供了一个框,可以在其中输入一行文本。 要输入多行文本,需要…