用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();

最后实现效果如下:

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

相关推荐
W.A委员会18 小时前
JS原型链详解
开发语言·javascript·原型模式
止语Lab18 小时前
Go并发编程实战:Channel 还是 Mutex?一个场景驱动的选择框架
开发语言·后端·golang
她说彩礼65万18 小时前
C# 实现简单的日志打印
开发语言·javascript·c#
绿浪198418 小时前
c# 中结构体 的定义字符串字段(性能优化)
开发语言·c#
房开民19 小时前
可变参数模板
java·开发语言·算法
Drone_xjw19 小时前
一次 Qt 程序在 Kylin 系统下表头“白屏”的排查之旅
qt·kylin·一次
t***54419 小时前
如何在现代C++中更有效地应用这些模式
java·开发语言·c++
itman30120 小时前
C语言、C++与C#深度研究:从底层到现代开发演进全解析
c语言·c++·c·内存管理·编译模型
Victoria.a20 小时前
python基础语法
开发语言·python
xiaoyaohou1121 小时前
023、数据增强改进(二):自适应数据增强与AutoAugment策略
开发语言·python