首先我们了解一下什么是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 <QObject>
#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<AppData>& data);
void loginError();
private:
QList<AppData> list;
AppListApi api; // 获取数据的接口的对象
DeleteProject deleteProject; // 删除数据的对象
};
接下来是vm
ViewModel.cpp
#include "itemvm.h"
ItemViewModel::ItemViewModel(QObject *parent) : QObject(parent) {
connect(&model, &ItemListModel::dataChanged, this, [&] (const QList<AppData>& 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 <QObject>
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<QList<AppData>> listData;
private:
ItemListModel model;
};
此处我就不在具体描述观察者的类如何写了,他的主要功能就是通过对数据变化的监听,做出相应反应(可以做出两种:1.数据变换时发出信号;2.只要有交互的动作,不管数据是否改变都发出信号)。(实在不会私信我)
剩下的view我也不描写了,具体也就是实例化一个vm的对象,然后对对象的函数调用来操作数据的变化。
以上只能算是我粗略的见解,若有不对请指正!感谢!