用QT实现MVP模式

近些天用qt 作项目,遇到参数界面.偷闲写个mvp模式示例.

mvp模式重要的有两点

1 低耦合: 界面与后端数据类,不直接引用,可方便替换.

2 形成界面驱动-界面更新的闭环.:通过函数指针类技术,让数据自动回流.

MVP (Model-View-Presenter)

视图(View):

  • 接收用户的交互请求并根據需求展示数据给用户
  • 响應的數据可以是一個Model或者多個Model的混合

主持人(Presenter):

  • View 和 Mode的連接器
  • 接收 View 的要求 并給对应的Model去處理

模型(Model):

  • 負責數据 (增加,删除,更改,查詢)
  • 相關的业务逻辑,而不是在Presenter (因為會使Presenter變得臃腫)

参考:

一文读懂MVC、MVP和MVVM架构

直接上代码,

QT5.9.0 ,C++11

view, 包括一个设置数据的接口与一个要求数据的信号(类似于函数指针);诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼

cpp 复制代码
//.h
class DialogView : public QDialog
{
    Q_OBJECT

public:
    explicit DialogView(QWidget *parent = nullptr);
    ~DialogView();


    void UpdateVidw(UerData data);

signals:
    void UpdateView_Signal();


private slots:
    void on_btnRefresh_clicked();

private:
    Ui::DialogView *ui;
};

//.cpp
void DialogView::UpdateVidw(UerData data)
{
    this->ui->comboBox->setCurrentIndex(data.SelIdx);
    this->ui->lineEdit->setText(data.txt);
    this->ui->spinBox->setValue(data.num);
    this->ui->timeEdit->setTime(data.utime);
    this->ui->dial->setValue(data.SelNum);
}

void DialogView::on_btnRefresh_clicked()
{
    emit this->UpdateView_Signal();
}

流通使用的数据结构

cpp 复制代码
struct UerData
{
public:
    int SelIdx;
    QString txt;
    int num;
    QTime utime;
    int SelNum;
};

Model. 提供数据源

cpp 复制代码
//.h
class DataModel
{
public:
    UerData data;


    void UpdateData();
};

//.cpp
void DataModel::UpdateData()
{
    // 模拟从外网,下位机设备等拿取数据.
    qsrand(QTime::currentTime().msec());

    data.SelIdx = qrand()%3;
    data.txt = data.SelIdx == 1 ? "NUm1" : "deg2";
    data.utime = QTime::currentTime();
    data.num = qrand() % 1000;
    data.SelNum = qrand() % 100;
}

Presenter, 提供连接View 和model的方法

cpp 复制代码
//.h
class Presenter : public QObject
{
    Q_OBJECT
public:
    explicit Presenter(DataModel* model, DialogView* view,  QObject *parent = nullptr);


public slots:
    void fetchData();

private:
    DataModel* m_model;
    DialogView* m_view;
};

// .cpp
Presenter::Presenter(DataModel *model, DialogView *view, QObject *parent)
    : QObject{parent}
{
    this->m_model = model;
    this->m_view = view;

    // 通过fetchData函数 ,绑定view与 model ,类似给函数指针赋值;
    QObject::connect(view, SIGNAL(UpdateView_Signal()),
                     this, SLOT(fetchData()));
}

void Presenter::fetchData()
{
    this->m_model->UpdateData();
    this->m_view->UpdateVidw(m_model->data);
}

使用代码:

cpp 复制代码
    DialogView *dlg = new DialogView();
    DataModel *model = new DataModel();
    Presenter *p = new Presenter(model, dlg);

    dlg->exec();

最后实现效果如下:

点击"更新"按钮数据自动更新.

相关推荐
孤华暗香几秒前
Python快速入门 —— 第三节:类与对象
开发语言·python
一丝晨光15 分钟前
逻辑运算符
java·c++·python·kotlin·c#·c·逻辑运算符
元气代码鼠16 分钟前
C语言程序设计(进阶)
c语言·开发语言·算法
霍霍哈嗨28 分钟前
【QT基础】创建项目&项目代码解释
开发语言·qt
friklogff29 分钟前
【C#生态园】从图像到视觉:Emgu.CV、AForge.NET、OpenCvSharp 全面解析
开发语言·c#·.net
虚拟搬运工1 小时前
Python类及元类的创建流程
开发语言·chrome·python
Code哈哈笑1 小时前
【C++ 学习】多态的基础和原理(10)
java·c++·学习
Aurora_th2 小时前
树与图的深度优先遍历(dfs的图论中的应用)
c++·算法·深度优先·图论·dfs·树的直径
消失的旧时光-19432 小时前
kotlin的密封类
android·开发语言·kotlin
A_cot2 小时前
Redis 的三个并发问题及解决方案(面试题)
java·开发语言·数据库·redis·mybatis