鱼C论坛

 找回密码
 立即注册
查看: 4946|回复: 3

[技术原创] 157 - 模型/视图编程(Model/View) - 【扫盲】

[复制链接]
发表于 2016-11-25 09:43:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2016-11-25 10:47 编辑

0.png


应用程序中往往要存储大量的数据,并对他们进行处理,然后通过各种形式先是给用户。

用户需要时还可以对数据进行编辑。

Qt中的模型/视图架构就是用来实现:

大量数据的存储处理显示


Qt 4 中就引入了一个新的项视图类!

使用模型/视图架构(就是上面那张图)来管理数据和展示给用户的方式之间的关系

引入:

'功能分离思想为开发者定制项目提供高度的灵活性'


帮助文档:Model/View Programming

0.gif



  • 架构介绍


  • MVC(Model View Controller)是一种起源于Smalltalk设计模式

    用于创建用户界面!


    MVC包含三个组件:

    Model -> 模型是应用对象,表示数据

    View -> 视图是用户界面,显示数据

    Controller -> 控制定义了界面与用户的交互方式。

    上面那个稍微翻一下:

    0.png


    模型与数据进行通信,为架构中的其他组件提供了接口。

    视图从模型中获得模型索引(Model Index)。

    模型索引用来显示数据。

    当编辑项目时,代理使用模型索引直接与模型进行通信!

    将视图和控制组件结合起来就形成了模型/视图架构。

    同样将数据和存储向用户的展示进行了分离,提供了更为简单的框架。

    数据和界面进行了分离,这样做使得:

    相同的数据在多个不同的视图中显示成为可能


    并且这样只需要改变顶层的视图,并不需要改变最底层的数据框架。

    为了用户输入能进行灵活处理,还引入了委托(Delegate,代理)

    Delegate的引入后,就可以定制数据的渲染和编辑方式!


  • 组成部分


  • 大体上,MVC可以分为3组:

    模型、 视图、 代理


    其中每一个组件都使用了抽象基类来定义,三者之间通过信号和槽来实现通信

    -> 当数据源数据发生改变时,模型发出信号告知视图。

    -> 当用户与显示的项目交互时,视图发出信号提供交互信息。

    -> 当编辑时,代理发出信号,告知模型、视图编辑器的状态。


    • 模型


    • Model.png


      所有的模型都基于QAbstractItemModel类,这个牛x类定义了一个接口,可以提供视图、委托来访问数据。

      数据本身并不是一定要存储在模型中,也可以存储在一个数据结构、一个独立的类、文件、数据库、应用程序中的其他组件中。

      这个类提供的接口让数据可以灵活的处理各种视图,这些视图可以将数据变现为:

      表格(table)、列表(list)、树(tree)等形式。

      Qt还提供了一些现成的模型来处理数据项:

      -> QStringListModel 用来存储一个简单的QString项目列表

      -> QStandardItemModel 管理复杂的树形结构数据项,每一个数据项可以包含任意的数据

      -> QFileSystemModel 提供了本地文件系统中文件、目录的信息

      -> QSqlQueryModel、QSqlTableModel、QSqlRealtionalTableModel 用来访问数据库



    • 视图


    • View.png


      Qt提供了几种不同的类型的视图,他们都完全实现了各自的功能。

      -> QListView 将数据项显示为一个列表。

      -> QTableView 将模型中数据项先是在一个表格中。

      -> QTreeView 将模型的数据项显示在具有层次的列表中。



    • 代理


    • Delegate.png


      QAbstractItemDelegate是代理的抽象基类。

      从Qt 4.4版本开始,默认的委托实现由QStyledItemDelegate类提供,这也被用作Qt标准视图的默认委托。

      QStyledItemDelegate 和 QItemDelegate 是相互独立的哈~

      只能选择其一来为视图中的项目绘制和提供编辑器。

      他们的主要不同就是:

      QStyleItemDelegate使用当前的样式来绘制他的项目。

      就是说你要使用样式表(QSS),就用这个作为基类



本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-25 11:12:12 | 显示全部楼层
哎呦,更新了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-25 11:16:12 | 显示全部楼层
wei_Y 发表于 2016-11-25 11:12
哎呦,更新了。

怨我,太爱小天才养殖场了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-4 00:44:07 From FishC Mobile | 显示全部楼层
大爱技术贴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 17:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表