c++ 实现简易mvvm架构模型,不知道对不对

最近因为要用c++实现mvvm。对这些架构(MVC, MVP, MVVM)雨里雾里。
看了一些文章介绍,总体觉得mvvm除了前后端分离,解耦,最大的特点是数据的双向绑定,即当view改变时,可以通过viewmodel自动改变model,当model改变时,也可以通过viewmodel自动改变view。
如果理解偏差,前辈们多多指点。感谢!

实现思路:采用回调函数的方法:即在view初始化的时候bind一个修改view自身数据的function。 同样在初始化model的时候,bind一个修改model自身的function。然后在viewModel里面模拟修改view和model。在修改view的时候,调用model的回调函数,在修改model的时候,调用view的回调函数。
其实:感觉实现方法很多,比如我直接全部用static调用过去也可以。如果理解偏差,前辈们多多指点。感谢!

#include <iostream>
#include <functional>
#include <map>
#include <string>

//只测试绑定一个数据,name=xxx
std::map<std::string, std::function<void(std::string)> > viewChange;
std::map<std::string, std::function<void(std::string)> > modelChange;
std::string properName = "name";

class View
{
    public:
        explicit View(std::string properName, std::string data) : _data(data), _properName(properName) {
            viewChange[_properName] = std::bind(&View::setData, this, std::placeholders::_1);
        }
        void ViewChange(std::string data)
        {
            modelChange[_properName](data);
        }
        void printViewData() {
            std::cout << this->_data << std::endl;
        }
    private:
        std::string _data;
        std::string _properName;
        void setData(std::string data){
            this->_data = data;
        }
};

class Model
{
    public:
        explicit Model(std::string properName, std::string data) : _data(data), _properName(properName){
            modelChange[_properName] = std::bind(&Model::setData, this, std::placeholders::_1);
        }
        void ModelChange(std::string data){
            viewChange[_properName](data);
        }
        void printModelData(){
            std::cout << this->_data << std::endl;
        }

    private: 
        std::string _data;
        std::string _properName;
        void setData(std::string data){
            this->_data = data;
        }
};

class ViewModel
{
    public:
        explicit ViewModel() : _model("name", "zhjwangModel"), _view("name", "zhjwangView"){}
        void changeModel(std::string data)
        {
            _model.ModelChange(data);
        }
        void changeView(std::string data){
            _view.ViewChange(data);
        }
    private:
        Model _model;
        View _view;
};

int main()
{
    //一开始会改变map中的函数绑定,因为我们都是在初始化的时候做的std::bind,而ViewModel中也要初始化两个对象,所以一开始std::bind的是ViewModel中的两个对象。后面又会改变,所以写在前面
    ViewModel viewmodel; 

    auto view = View(properName, "zhjwang");
    view.printViewData();
    viewmodel.changeModel("laowang"); //模拟model改变时,通知到ViewModel
    view.printViewData();

    auto model = Model(properName, "aaa");
    model.printModelData();
    viewmodel.changeView("bbb");  //模拟view改变时,通知到model
    model.printModelData();

    return 0;
}
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MVVM(Model-View-ViewModel)是一种软件架构模式,用于将应用程序的用户界面与其相关的业务逻辑和数据分离开来。 在Qt中实现MVVM架构可以使用以下组件: 1. Model:Qt中的模型通常是QAbstractItemModel的子类,用于提供数据。模型负责数据的读取、存储和更新,也可以发送信号通知视图数据的变化。 2. View:视图负责显示数据和接收用户输入,同时与ViewModel进行交互来获取数据。在Qt中,视图可以是QWidget或QML元素。 3. ViewModel:ViewModel是视图和数据模型之间的中间层,负责处理视图的请求并将其转换为模型能够理解的操作。ViewModel还负责将模型中的数据格式化为视图可以显示的格式,并将视图中的用户输入转换为模型可以理解的操作。 下面是一个简单的Qt MVVM示例: ```cpp // MyModel.h class MyModel : public QAbstractListModel { Q_OBJECT public: explicit MyModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent) const override; QVariant data(const QModelIndex &index, int role) const override; // ... }; // MyViewModel.h class MyViewModel : public QObject { Q_OBJECT public: explicit MyViewModel(QObject *parent = nullptr); Q_INVOKABLE QVariantList getData() const; Q_INVOKABLE void setData(const QVariantList &data); private: MyModel *m_model; }; // MyView.qml ListView { model: myViewModel.getData() delegate: Text { text: modelData.name } // ... } // main.cpp int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); MyModel model; MyViewModel viewModel; viewModel.setData(model.getData()); QQmlEngine engine; engine.rootContext()->setContextProperty("myViewModel", &viewModel); QQmlComponent component(&engine, QUrl("MyView.qml")); QObject *object = component.create(); // ... return app.exec(); } ``` 在这个示例中,MyModel是一个QAbstractListModel的子类,用于提供数据。MyViewModel是一个QObject的子类,它包含了一个指向MyModel的指针,并提供了两个Q_INVOKABLE函数:getData和setData,用于从模型中获取数据和将数据设置到模型中。MyView是一个QML文件,用于显示数据。它包含一个ListView元素,使用myViewModel.getData()作为模型,并使用一个Text元素作为委托。 在main函数中,我们创建了一个MyModel对象和一个MyViewModel对象,并通过setData将模型中的数据设置到ViewModel中。然后,我们创建了一个QQmlEngine对象,并将myViewModel对象注册到rootContext中。最后,我们使用QQmlComponent创建了一个MyView对象,并将其显示出来。 这只是一个简单的Qt MVVM示例,实际上MVVM框架非常灵活,可以根据具体的需求进行设计和实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值