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

news2024/11/26 0:29:58

最近做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

 

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

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

相关文章

椭圆滤波器

之前的文章 信号去噪 中列出了7种常用的信号去噪算法,对于后两种算法——深度学习和奇异值分解(SVD),我现在也不太理解,就先不写了。 很多朋友留言又提了一些算法,今天一起来聊聊椭圆滤波器。 椭圆滤波器(Elliptic F…

极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

引言 前端性能已成为网站和应用成功的关键要素之一。用户期望快速加载的页面和流畅的交互,而前端框架的选择对于实现这些目标至关重要。然而,传统的前端框架在某些情况下可能面临性能挑战且存在技术壁垒。 在这个充满挑战的背景下,我们引入…

新大陆NVH200-AP(U)扫码枪在上位机软件开发中的应用

前言: 由于本次使用的是USB接口的扫码枪 1、先安装Nset软件,使用扫码枪扫描“启动设置条码”,然后扫描“USB CDC串口”条码 2、打开NSet软件,点击“刷新按钮” 就能找到扫码枪设备 3、设置条码后缀 点击“高级设置”,然后点击“数据编辑”,在“后缀”那里设置结束符…

〔001〕虚幻 UE5 安装教程

✨ 目录 🎈 下载启动程序🎈 注册个人账户🎈 选择引擎版本🎈 选择安装选项🎈 虚幻商城的使用🎈 每月免费插件🎈 安装插件🎈 下载启动程序 下载地址:https://www.unrealengine.com/zh-CN/download点击上面地址,下载 UE5 启动程序并安装🎈 注册个人账户 打开商…

发送Http请求的HttpClientUtil工具

发送Http请求的HttpClientUtil工具 代码如下: /*** author xuan* create 2023/11/6*/ public class HttpUtil {// 创建连接池管理器private static final PoolingHttpClientConnectionManager connMgr new PoolingHttpClientConnectionManager();// http客户端pr…

Java 求两个向量余弦相似度计算代码

Java 求两个向量余弦相似度计算代码 公式&#xff1a; 源码&#xff1a; public Double getCosineSimilarity( List<Double> x, List<Double> y ){double numerator 0D;for( int i 0; i < x.size(); i ){numerator x.get( i ) * y.get( i );}double leftD…

在 Python 中使用 Selenium 按文本查找元素

我们将通过示例介绍在Python中使用selenium通过文本查找元素的方法。 在 Python 中使用 Selenium 按文本查找元素 软件测试是检查应用程序是否满足用户需求的技术。 该技术有助于使应用程序成为无错误的应用程序。 软件测试可以手动完成&#xff0c;也可以通过某些软件完成。…

电脑怎么恢复删除的文件?恢复文件必备3个方法分享!

“由于我经常需要处理大量的文件&#xff0c;我在电脑里建了一个文件夹放比较重要的文件&#xff0c;但不知道由于我误操作还是什么原因&#xff0c;文件夹里的部分文件消失了&#xff0c;我现在很是烦恼&#xff0c;有什么方法可以帮我恢复删除的文件吗&#xff1f;” 处理电脑…

【Python】批量下载素材酷视频资源

【需求】 做视频精彩需要用到梗图视频等,但是素材酷上面的视频没有搜索功能,每次用起来还要去下载也很麻烦,下载只能一个一个下载也很麻烦,下要搞一个能够批量下载的功能,然后把下载的资源全部放进万兴喵影编辑器的云空间,这样就可以做到随做随查随用了。 【效果】 目…

第68讲:MySQL触发器的核心概念以及常见的触发类型应用案例

文章目录 1.触发器的概念2.触发器操作的语法结构3.各类触发器的典型应用案例3.1.需求描述以及实现思路3.2.创建日志表3.3.INSERT类型的触发器3.4.UPDATE类型的触发器3.5.DELETE类型的触发器 1.触发器的概念 触发器是与表中数据相关的数据库对象&#xff0c;当表中的数据产生in…

为什么江西的彩礼高?

作为一名江西土生土长的娃&#xff0c;今天和大家聊一聊江西的彩礼为何如此高&#xff1f; 江西的彩礼之所以高&#xff0c;主要与江西省的传统文化习俗、经济条件及社会观念等因素有关。那么我们从传统文化&#xff0c;经济条件&#xff0c;社会观念这三点出发。 1.传统文化习…

使用Kotlin与Unirest库抓取音频文件的技术实践

目录 摘要 一、Kotlin与Unirest库概述 二、使用Kotlin和Unirest抓取音频文件 1、添加Unirest依赖 2、发送HTTP请求获取音频文件 3、保存音频文件 三、完整代码示例 四、注意事项 结论 摘要 本文详细阐述了如何使用Kotlin编程语言与Unirest库抓取网络上的音频文件。首…

K8s:部署 CNI 网络组件+k8s 多master集群部署+负载均衡及Dashboard k8s仪表盘图像化展示管理

目录 1 部署 CNI 网络组件 1.1 部署 flannel 1.2 部署 Calico 1.3 部署 CoreDNS 2 负载均衡部署 3 部署 Dashboard 1 部署 CNI 网络组件 1.1 部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容…

深度学习中的数据类型介绍:FP32, FP16, TF32, BF16, Int16, Int8 ...

文章目录 0. 前言1. 数据的存储方式2. 不同数据类型介绍2.1 深度学习中常用的数据类型2.2 BF16 类型的优势2.3 不同数据类型的使用场景 0. 前言 相比于 CPU&#xff0c;GPU 在架构设计时将更多的晶体管用于数据处理&#xff0c;而不是数据缓存和流量控制&#xff0c;因此可以高…

【Python基础】Python函数介绍(超全面、缺省参数、多值传参、可变参数等)

函数进阶 1.01. 函数参数和返回值的作用1.1无参数&#xff0c;无返回值1.2 无参数&#xff0c;有返回值1.3 有参数&#xff0c;无返回值1.4 有参数&#xff0c;有返回值 2.不可变和可变的参数3.多值参数 1.01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值&…

Maven3.9.1安装及环境变量配置

一、Maven的下载与安装 maven各版本下载地址 打开链接后自行选择对应版本 下载完成后解压安装,最好别选择c盘,安装目录路径等使用英文,避免产生其他问题 我这里选择的是D盘 二、Maven的环境变量配置 2.1、右键点击此电脑选择属性&#xff0c;点击高级系统设置&#xff0c;点…

Coremail与国家信息安全漏洞库(CNNVD)达成深度合作!

漏洞信息共享合作单位证书 近日&#xff0c;Coremail获得由国家信息安全漏洞库&#xff08;CNNVD&#xff09;颁发的“CNNVD漏洞信息共享合作单位”证书。 此证书是国家权威机构对Coremail安全研究技术和漏洞挖掘技术实力的充分肯定&#xff0c;也是双方合作的里程碑。 国家信…

Redis之Java操作连接操作Redis

前言 Java是一种强大的编程语言&#xff0c;而Redis是一个快速且具有高可扩展性的开源键值数据存储系统。使用Java操作Redis可以提高效率和性能&#xff0c;并且能够满足大规模数据存储和处理的需求。在本篇文章中&#xff0c;我们将介绍如何使用Java连接Redis&#xff0c;以及…

企业文件夹同步,怎样让数据管理更高效?

随着企业数据量的不断增加&#xff0c;如何高效地进行文件夹同步已成为企业提升工作效率、确保数据安全的重要一环。飞驰云联的同步软件作为一款专门针对企业级用户的数据同步解决方案&#xff0c;在实践中表现出色&#xff0c;值得信赖。 飞驰云联的同步软件是一款高效、稳定、…

axios下载csv文件下载-功能实现

须将axios 配置中的responseType设置为arraybuffer text/comma-separated-values, text/csv, application/csv, application/excel, application/vnd.ms-excel, application/vnd.msexcel // 下载文件 async exportConsumeList() {try {let res await exportConsumeList…