用QT实现MVP模式

这篇具有很好参考价值的文章主要介绍了用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, 包括一个设置数据的接口与一个要求数据的信号(类似于函数指针);诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼诉讼

//.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();
}

流通使用的数据结构

struct UerData
{
public:
    int SelIdx;
    QString txt;
    int num;
    QTime utime;
    int SelNum;
};

Model. 提供数据源

//.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的方法

//.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);
}

使用代码:

    DialogView *dlg = new DialogView();
    DataModel *model = new DataModel();
    Presenter *p = new Presenter(model, dlg);

    dlg->exec();

最后实现效果如下:

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

用QT实现MVP模式,设计模式,qt,开发语言,c++,MVP

 文章来源地址https://www.toymoban.com/news/detail-673410.html

到了这里,关于用QT实现MVP模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式】C语言使用共享内存和信号量,完美实现生产者与消费者模式

    生产者和消费者模式适用于生产者和消费者之间存在数据交换的场景。在这种模式中,生产者负责生产数据并将其放入缓冲区,而消费者负责从缓冲区中取出数据并进行处理。这种模式的优点是可以实现生产者和消费者之间的解耦,使得它们可以独立地进行操作,从而提高了

    2024年02月03日
    浏览(36)
  • 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    代理模式(Proxy Pattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源

    2023年04月25日
    浏览(80)
  • 【单例设计模式原理详解】Java/JS/Go/Python/TS不同语言实现

    单例模式(Singleton Pattern)属于创建型设计模式,这种模式只创建一个单一的类,保证一个类只有一个实例,并提供一个访问该实例的全局节点。 当您想控制实例数目,节省系统资源,并不想混用的时候,可以使用单例模式。单例有很多种实现方式,主要分为懒汉和饿汉模式

    2023年04月27日
    浏览(88)
  • 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 如果你需要复制一些对

    2023年04月24日
    浏览(79)
  • 【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    策略模式(Strategy Pattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。 当你想使用对象中各种不同的算法变体,使用if...else 所带来的复杂和难以维护,可使用策略模式。或者当有许多相同类,它们仅

    2024年02月01日
    浏览(42)
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    模板方法模式(Template Method Pattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法

    2024年02月01日
    浏览(80)
  • 【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    迭代器模式(Iterator Pattern),是一种结构型设计模式。给数据对象构建一套按顺序访问集合对象元素的方式,而不需要知道数据对象的底层表示。 迭代器模式是与集合共存的,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List、Set、Map等

    2023年04月17日
    浏览(45)
  • 【享元设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    享元模式(Flyweight Pattern),是一种结构型设计模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。 当程序需要生成数量巨大的相似

    2023年04月10日
    浏览(36)
  • 【访问者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    访问者模式(Visitor Pattern)是一种行为型模式。它封装一个访问者类,把各元素类的操作集合起来,目的是将数据结构与数据操作分离。在不改变原有元素类数据结构的前提下,改变了元素类的执行算法。 当某些较为稳定的东西(数据结构或算法),不想直接被改变但又想扩

    2024年02月02日
    浏览(76)
  • 【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    观察者模式(Observer Pattern)是一种行为型模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 观察者模式使用三个类Subject、Observer和Client。Subject对象带有绑定观察者到Client对象和从Client对象解绑观察

    2023年04月21日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包