Qt实现简单的mvvm设计架构(笔记)

首先我们了解一下什么是mvvm架构,其实主要都已经集中在名字上了

m:model

v:view

vm:viewModel

一般来说,model就是数据模型,view就是界面显示,而viewModel则相当于view和model的中转站。通俗讲,用户触发view,view传信号给viewModel,viewModel去改变model,然后model改变被viewModel捕捉到,viewModel去通知view刷新。

vm对model的监测就是观察者模式,同时一旦有多种状态,建议使用枚举去定义。在这种独特的框架下,我们不难看出,即使没有view,其他的文件也能独立运行,这十分符合我们c++面对对象的思想。

tips:若此架构下有工具类,则写成静态类。

眼过千遍不如手过一遍,下面直接上代码:

model.cpp

#include "itemlistmodel.h"

ItemListModel::ItemListModel(QObject *parent) : QObject(parent) {

}
void ItemListModel::getAppData() {
    // 获取列表数据
    // 此处可以写获取数据的代码
}

void ItemListModel::deleteData(const int &appId) {
    // 删除数据
    deleteProject.deleteApp(appId);
    connect(&deleteProject, &DeleteProject::deleteSuccess, [&] {
        getAppData();
    });
}

model.h

#pragma once

#include 

#include "引用处理数据的头文件"

class ItemListModel : public QObject
{
    Q_OBJECT

public:
    explicit ItemListModel(QObject *parent = nullptr);
    void getAppData();                                      // 获取数据
    void deleteData(const int &appId);                      // 删除数据

signals:
    void dataChanged(const QList& data);
    void loginError();

private:
    QList list;
    AppListApi api;                                         // 获取数据的接口的对象
    DeleteProject deleteProject;                            // 删除数据的对象
};

接下来是vm

ViewModel.cpp

#include "itemvm.h"

ItemViewModel::ItemViewModel(QObject *parent) : QObject(parent) {
    connect(&model, &ItemListModel::dataChanged, this, [&] (const QList& data) {
        listData = data;
        emit loginOK();
    });
    connect(&model, &ItemListModel::loginError, this, [&] {
        emit loginError();
    });
}

void ItemViewModel::getItem() {
    model.getAppData();
}

void ItemViewModel::deleteItem(const int &appId) {
    model.deleteData(appId);
}

ViewModel.h

#pragma once

#include "listener/mutableproperty.h"    // 观察者模式下的监听类
#include "pages/itemlist/model/itemlistmodel.h"
#include 

class ItemViewModel : public QObject
{
    Q_OBJECT
public:
    explicit ItemViewModel(QObject *parent = nullptr);
    void getItem();
    void deleteItem(const int &appId);

signals:
    void loginError();
    void loginOK();

public:
    MutableProperty> listData;

private:
    ItemListModel model;
};

此处我就不在具体描述观察者的类如何写了,他的主要功能就是通过对数据变化的监听,做出相应反应(可以做出两种:1.数据变换时发出信号;2.只要有交互的动作,不管数据是否改变都发出信号)。(实在不会私信我)

剩下的view我也不描写了,具体也就是实例化一个vm的对象,然后对对象的函数调用来操作数据的变化。

以上只能算是我粗略的见解,若有不对请指正!感谢!

你可能感兴趣的:(笔记,架构)