网站功能规划,电子商务企业创建方案,动漫制作专业简历,j建设网站备案流程model/View 架构
导读
我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改…model/View 架构
导读
我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改的地方写回,然后刷新组件进行显示。这个思路很简单,也很清晰,但是对于大型程序,这种设计就显得苍白无力。比如,在一个大型系统中,你的数据可能很大,全部存入一个组件的数据对象中,效率会很低,并且这样的设计也很难在不同组件之间共享数据。如果你要几个组件共享一个数据对象,要么你就要用存取函数公开这个数据对象,要么你就必须把这个数据对象放进不同的组件分别进行维护。
Smalltalk 语言发明了一种崭新的实现,用来解决这个问题,这就是著名的 MVC 模型。对这个模型无需多言。MVC 是 Model-View-Controller 的简写,即模型-视图-控制器。在 MVC 中,模型负责获取需要显示的数据,并且存储这些数据的修改。每种数据类型都有它自己对应的模型,但是这些模型提供一个相同的 API,用于隐藏内部实现。视图用于将模型数据显示给用户。对于数量很大的数据,或许只显示一小部分,这样就能很好的提高性能。控制器是模型和视图之间的媒介,将用户的动作解析成对数据的操作,比如查找数据或者修改数据,然后转发给模型执行,最后再将模型中需要被显示的数据直接转发给视图进行显示。MVC 的核心思想是分层,不同的层应用不同的功能。
Model/View 理论结构图 如上图所示,模型与数据源进行交互,为框架中其它组件提供接口。这种交互的本质在于数据源的类型以及模型的实现方式。视图从模型获取模型索引,这种索引就是数据项的引用。通过将这个模型索引反向传给模型,视图又可以从数据源获取数据。在标准视图中,委托渲染数据项;在需要编辑数据时,委托使用直接模型索引直接与模型进行交互。
总的来说,model/view 架构将传统的 MV 模型分为三部分:模型、视图和委托。每一个组件都由一个抽象类定义,这个抽象类提供了基本的公共接口以及一些默认实现。模型、视图和委托则使用信号槽进行交互:
来自模型的信号通知视图,其底层维护的数据发生了改变。来自视图的信号提供了有关用户与界面进行交互的信息。来自委托的信号在用户编辑数据项时使用,用于告知模型和视图编辑器的状态。Qt 中Model #mermaid-svg-XlYKCnJedrSjXrF1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-XlYKCnJedrSjXrF1 .error-icon{fill:#552222;}#mermaid-svg-XlYKCnJedrSjXrF1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XlYKCnJedrSjXrF1 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-XlYKCnJedrSjXrF1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XlYKCnJedrSjXrF1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XlYKCnJedrSjXrF1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XlYKCnJedrSjXrF1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XlYKCnJedrSjXrF1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XlYKCnJedrSjXrF1 .marker.cross{stroke:#333333;}#mermaid-svg-XlYKCnJedrSjXrF1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XlYKCnJedrSjXrF1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XlYKCnJedrSjXrF1 .cluster-label text{fill:#333;}#mermaid-svg-XlYKCnJedrSjXrF1 .cluster-label span{color:#333;}#mermaid-svg-XlYKCnJedrSjXrF1 .label text,#mermaid-svg-XlYKCnJedrSjXrF1 span{fill:#333;color:#333;}#mermaid-svg-XlYKCnJedrSjXrF1 .node rect,#mermaid-svg-XlYKCnJedrSjXrF1 .node circle,#mermaid-svg-XlYKCnJedrSjXrF1 .node ellipse,#mermaid-svg-XlYKCnJedrSjXrF1 .node polygon,#mermaid-svg-XlYKCnJedrSjXrF1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XlYKCnJedrSjXrF1 .node .label{text-align:center;}#mermaid-svg-XlYKCnJedrSjXrF1 .node.clickable{cursor:pointer;}#mermaid-svg-XlYKCnJedrSjXrF1 .arrowheadPath{fill:#333333;}#mermaid-svg-XlYKCnJedrSjXrF1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XlYKCnJedrSjXrF1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XlYKCnJedrSjXrF1 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-XlYKCnJedrSjXrF1 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-XlYKCnJedrSjXrF1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XlYKCnJedrSjXrF1 .cluster text{fill:#333;}#mermaid-svg-XlYKCnJedrSjXrF1 .cluster span{color:#333;}#mermaid-svg-XlYKCnJedrSjXrF1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XlYKCnJedrSjXrF1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} QAbstractItemModel QAbstractListModel QStringListModel QAbstractProxyModel QSortFilterProxyModel QAbstractTableModel QSqlQueryModel QSqlTableModel QSqkRelationalTableModel