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 <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的对象,然后对对象的函数调用来操作数据的变化。

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

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MVVM 是一种软件架构模式,它将应用程序分为三个部分:Model,View 和 ViewModel。在Qt中,可以使用QML语言实现MVVM架构。 以下是使用QtMVVM架构的步骤: 1. 定义模型(Model):定义数据模型,可以使用Qt的Model/View框架来实现。 2. 定义视图(View):使用QML语言定义视图,包括用户界面和交互逻辑。 3. 定义视图模型(ViewModel):使用JavaScript编写视图模型,它是一个中间层,连接视图和模型。它负责管理视图和模型之间的数据传输和转换。 4. 将视图(View)和视图模型(ViewModel)连接起来:在QML中使用绑定来连接视图和视图模型。这样,当视图模型中的数据发生变化时,视图会自动更新。 5. 将模型(Model)和视图模型(ViewModel)连接起来:在视图模型中使用信号和槽机制来连接模型和视图模型。这样,当模型中的数据发生变化时,视图模型会接收到信号,然后更新视图。 下面是一个简单的例子: ```qml import QtQuick 2.0 Item { property string name property int age property string address TextField { text: name onTextChanged: { viewmodel.updateName(text) } } TextField { text: age.toString() onTextChanged: { viewmodel.updateAge(parseInt(text)) } } TextField { text: address onTextChanged: { viewmodel.updateAddress(text) } } Connections { target: viewmodel onUpdateName: name = newName onUpdateAge: age = newAge onUpdateAddress: address = newAddress } } ``` 在这个例子中,我们定义了一个Item,它包含三个属性:name,age和address。我们使用三个TextField来显示这些属性,并且每当属性发生变化时,我们会调用视图模型中的相应函数来更新模型中的数据。 在视图模型中,我们定义了三个函数:updateName,updateAge和updateAddress,它们分别用于更新name,age和address。我们还定义了三个信号:onUpdateName,onUpdateAge和onUpdateAddress,用于将模型中的数据传递给视图。 ```javascript function ViewModel(model) { this.model = model; this.updateName = function(newName) { this.model.name = newName; this.onUpdateName(newName); } this.updateAge = function(newAge) { this.model.age = newAge; this.onUpdateAge(newAge); } this.updateAddress = function(newAddress) { this.model.address = newAddress; this.onUpdateAddress(newAddress); } signal onUpdateName(string newName) signal onUpdateAge(int newAge) signal onUpdateAddress(string newAddress) } var model = { name: "John", age: 30, address: "123 Main St." } var viewmodel = new ViewModel(model); ``` 在这个例子中,我们定义了一个ViewModel对象,它接收一个模型对象作为参数。我们在这个对象中实现了updateName,updateAge和updateAddress函数,并且定义了三个信号。当这些函数被调用时,它们会更新模型中的数据,并且发出相应的信号。 最后,我们创建了一个模型对象和一个视图模型对象,并将它们连接起来。 这只是一个简单的例子,但是它演示了如何使用QtMVVM架构实现一个简单的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值