美文网首页MVCQt学习Qt
从MVC到Model-View-Delegate

从MVC到Model-View-Delegate

作者: b0542f6c4d28 | 来源:发表于2017-06-11 00:52 被阅读120次

Qt也写了不少时间了,来聊聊架构吧。

从java web中的mvc说起

做过Java Web开发的同学都知道,Java Web开发的发展历程。无模式->Model I ->Model II。

Model I

Model I

Model II

Model II

一个经典的MVC模式

MVC

qml中的Model-View-Delegate

在Qt中,进行了些许变化

Qt Qt

Controller被Delegate换掉了。

在Java Web中,当一个请求发送到服务器时,服务器会对请求进行解析,选择相应的控制器(Controller),然后控制器调用相关的服务(Service),在服务中进行业务逻辑操作和数据库的增删改查(调用DAO层),然后控制器根据相应的结果选择合适的视图返回给浏览器。

在qml中又是如何做的呢?首先,数据和展示是分离的。Model负责提供数据,而View负责展示。如何展示的任务就落在委托(Delegate)身上了。

凡事都有Hello World

举一个例子——在qml中写一个列表。

模型怎么选?

qml中提供了不少模型

  • ListModel
  • XmlListModel
  • VisualItemModel
  • Integers as Models
  • Object Instances as Models
  • C++ Data Models
  • ......

既然是做一个列表,当然可以用简单的ListModel。

ListModel{
        ListElement{name:"a"}
        ListElement{name:"b"}
        ListElement{name:"c"}
    }

视图怎么选?

qml中提供了三种基本的视图,分别是ListView,GridView,PathView。做列表,就选择ListView吧。

ListView{
  model: xxxx
  delegate: xxxx
}

怎么展示呢?也简单点吧,直接文本展示。

Text {text: name}

整个代码看起来是这个样子的

import QtQuick 2.9
ListView{
    model: ListModel{
        ListElement{name:"a"}
        ListElement{name:"b"}
        ListElement{name:"c"}
    }
    delegate: Text {text: name}
}

跑一跑

运行截图

这样,我没有多写一行代码,一个使用Model-View-Delegate的qml小程序就跑出来了。当然,这离实际应用还差得比较远,但是跨出了第一步,后面可以慢慢来。好的开始是成功的一半。

当数据变复杂的时候,比如说我需要用json,只需要修改Model;当需要更加绚丽的效果的时候,比如说点击动画,只需要修改Delegate。

举一个复杂一点的例子

chat app chat app

有没有感觉跟QQ不久前出的Tim很像,但是又不一样。

说几个点吧

  • 联系人这里有一个标了数字的圈圈,有的有,有的没有
  • 对话时对方的头像在左边,自己的在右边。聊天气泡颜色不一样
  • 时间线(Timeline)这里最复杂,有的是好几张图片,有的有文字说明,还有的是视频

个人使用感受

Model-View-Delegate这么做也是为了方便解耦,当需求变了的时候,可以用小一些的代价去适应变化。

Model有不少冗余

习惯了json的我,qml的模型不能原生支持,实在是很痛苦啊。

给一个稍微复杂的例子,看看qml的模型是怎么写的

ListModel{
        ListElement{
            name:"a"
            pics:[
                ListElement{url:"a.png"},
                ListElement{url:"b.png"}
            ]
        }
        ...
    }

是不是花了好的精力在ListElement上?用json又如何呢?

{
  "list":[{
      "name":"a",
      "attrs":[{
        "url":"a.png"
      },{
        "url":"b.png"
      }]
    }
  ]
}

是不是简洁了许多?是不是可以节省时间呢?用json去描述一个数据非常简单呢。

如何在项目中使用json呢?请参考这里

View有坑

视图中明确定义高度和宽度会有意向到不的错误哦!

没什么可说的Delegate

委托的话就跟自己写组件没什么区别。它相当于一个模板,等着模型的数据一来,就产生了非常漂亮的视图。

参考

相关文章

  • 从MVC到Model-View-Delegate

    Qt也写了不少时间了,来聊聊架构吧。 从java web中的mvc说起 做过Java Web开发的同学都知道,Ja...

  • React、Vue学习总结

    一、 从MVC到MVVM 从MVC到MVVM 1. (客户端)MVC调用关系 用户通过操作view调用contro...

  • 从MVC到MVVM

    前言: 前一段时间做音乐播放器的项目用到了MVC思想,遇到了很多的痛点,虽然将数据、操作、视图分离了,但是依然离不...

  • 从MVC到MVVM

    简述MVVM MVVM是Model-View-ViewModel的缩写。MVVM是一种设计思想。Model 层代表...

  • 从MVC到MVVM

    MVC思想写代码 MVVM思想改写代码

  • 从MVC到MVVM

    MVVM 特性 模型-视图-视图模型(model-view-viewmodel,MVVM),实质上是模型-视图-控...

  • iOS 从MVC到MVP

    写在前头:这里有个Demo,可以先下载 还记得这段代码“cell.model = model;”我们曾经都这么写,...

  • 从MVC到MVVM(一)

    MVC 任何一个正经开发过一阵子软件的人都熟悉MVC. 它意思是Model View Controller, 其用...

  • 京东大牛耗时7个月著作:SpringMVC+MyBatis开发从

    《Spring MVC+MyBatis开发从入门到项目实战》详细介绍了Spring MVC和MyBatis框架的基...

  • 从MVC到MVVM(初识Vue)

    前言:看本文之前需要了解最基本的MVC思想(附一篇本人之前写的MVC设计模式在JavaScript中的运用 仅供参...

网友评论

    本文标题:从MVC到Model-View-Delegate

    本文链接:https://www.haomeiwen.com/subject/lyacqxtx.html