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.hqwc.cn/news/164758.html

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

相关文章

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven核心概念

一.Maven的POM POM全称&#xff1a;Project Object Model【项目对象模型】&#xff0c;将项目封装为对象模型&#xff0c;便于使用Maven管理【构建】项目 pom.xml常用标签 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://m…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(一)

基于ARM语音识别的智能家居系统 我们接下来带大家完成基于语音识别的智能家居系统嵌入式项目实战&#xff0c;使用到stm32开发板&#xff0c;讯飞的离线语音识别&#xff0c;我们在此之前&#xff0c;我们先学习一些Linux系统的基本操作。 。 一、Linux简介 在嵌入式开发中&am…

Loki | 数据过期自动删除策略设计

最近使用 Loki 碰到一个比较蛋疼问题&#xff0c;配置日志过期时间&#xff0c;配置这种事情&#xff0c;自然是要参照官方文档了&#xff0c;当时就找到了这个文档&#xff0c;地址&#xff1a; https://github.com/grafana/loki/blob/v1.5.0/docs/operations/storage/retenti…

2023.11.4 Idea 配置国内 Maven 源

目录 配置国内 Maven 源 重新下载 jar 包 配置国内 Maven 源 <mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf> …

Flink -- 并行度

1、并行度&#xff1a; 对于一个Flink任务是有Source、Transformation和Sink等任务组成&#xff0c;一个任务由多个并行实例来执行&#xff0c;一个任务的并行实例数目被称为该任务的并行度。 2、TaskManager和Solt Flink是一个分布式流处理框架&#xff0c;它基于TaskManager…

建表时如何合理选择字段类型

前言 我们在建表的时候关于字段类型的选择会有这么几类人&#xff1a; 严谨型 严格调研每个字段可能的大小&#xff0c;然后根据不同字段类型的限制&#xff0c;进行选择&#xff0c;这一类人在创建关系型数据表的时候是没有问题的。图自己省事型 把所有字段都设置为String&a…

少林寺方丈:禅宗与AI;高手教你DALL-E 3保持人物连续性;何时加入创业公司能拿最高回报;吴恩达新课正式发布 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; OpenAI 开发者大会&#xff0c;首届 AI 春晚开启「人人都是开发者」时代 https://openai.com/blog/new-models-and-developer-product…

SMT:引领新时代公链赛道的龙头之选!

近年来&#xff0c;区块链技术的应用越来越广泛&#xff0c;而公链作为区块链技术的重要组成部分&#xff0c;也得到了越来越多的关注。SMT公链作为新兴的公链项目&#xff0c;正在吸引着越来越多的关注。 SMT平台由拥有丰富金融行业和区块链技术经验的专业团队运营&#xff0…

Android UI 开发·界面布局开发·案例分析

目录 ​编辑 1. 线性布局&#xff08;LinearLayout&#xff09; 2. 相对布局&#xff08;RelativeLayout&#xff09; 3. 表格布局&#xff08;TableLayout&#xff09; 4. 帧布局&#xff08;FrameLayout&#xff09; 5. 网格布局&#xff08;GridLayout&#xff0…

WordPress 企业一号wp主题企业建站模板V1.2.2开心版

模板简介&#xff1a; 企业一号是一款由主题巴巴团队原创设计开发的WordPress企业主题。这款主题配备了强大的可视化、模块化的页面设计功能&#xff08;页面构建器&#xff09;&#xff0c;让您通过添加不同的设计模块和配置模块选项就可以设计出各种丰富多彩的页面。主题还集…

11 传输层协议

1、传输层里比较重要的两个协议&#xff0c;一个是 TCP&#xff0c;一个是UDP 对于不从事底层开发的人员来讲&#xff0c;或者对于开发应用的人来讲&#xff0c;最常用的就是这两个协议。 2、TCP 和 UDP 有哪些区别&#xff1f; 1.TCP 是面向连接的&#xff0c;UDP 是面向无…

使用IDEA让文本对比不在变的困难

文章目录 前言操作1、IDEA与电脑磁盘任意文件的比较2、项目内部的文件比较3、剪切板比较4、IDEA本地历史比较5、IDEA版本历史对比 前言 在日常实际开发当中我们常常会对一些代码或内容进行比对查看是否有差异&#xff0c;这个时候不需要借用第三方比对插件&#xff0c;在IDEA中…