美文网首页PySide2 Tutorial
PySide2学习记录(十五):Model和View

PySide2学习记录(十五):Model和View

作者: 3ni | 来源:发表于2018-12-10 19:33 被阅读0次

Python版本3.7
PySide2 Version: 5.14.1
官方文档:https://doc.qt.io/qtforpython/overviews/model-view-programming.html

大家都知道MVC模型,即model-view-controller模型,如果将view和controller结合起来就形成了这里所说的model/view,即视图(view)不仅需要展示数据,还会处理用户的输入部分。那么为了灵活地处理用户的输入,这里引入了delegate(委托),它将提供数据的编辑,并将编辑后的数据传递给模型,如下图所示。

图1

先看一个Demo:

from PySide2.QtWidgets import QApplication, QWidget, QListView, QVBoxLayout
from PySide2.QtCore import QStringListModel


app = QApplication()
window = QWidget()
window.setFixedSize(400, 300)

# 生成一个view
listview = QListView()
# 生成一个model
model = QStringListModel()

# model添加数据
model.setStringList(['111', '222', '333', '444', '555'])
# view设置model
listview.setModel(model)

# 打印view的delegate
defalut_delegate = listview.itemDelegate()
print(defalut_delegate)

layout = QVBoxLayout(window)
layout.addWidget(listview)
window.setLayout(layout)
window.show()
app.exec_()

上面一个例子用于显示一个列表,每个列表的类型是字符串类型。下面简单介绍各个部分,详细部分建议查看官方文档。

Model

Model当然是用于存放数据的,数据本身一般存储在文件或者数据库中,需要准备显示时才会载入进来。所有的Model都继承自QAbstractItemModel类。从这个类往下有一些常用的Model供我们使用。
QStringListModel用于存储简单的字符串列表数据。
QAbstractTableModel用于存储表格类数据,不可直接使用。它的子类有QSqlQueryModelQSqlTableModelQSqlRelationalTableModel
QStandardItemModel用于管理更复杂结构的数据,比如表格,树型等。
QFileSystemModel用于提供本地文件系统中的文件和目录方面的信息。
QSqlQueryModelQSqlTableModelQSqlRelationalTableModel用于处理数据库里面的数据。
当然我们也可以自己继承QAbstractItemModelQAbstractListModelQAbstractTableModel来实现自己的Model。

View

视图主要用来展示数据,但也包含了delegate。Qt为我们提供了以下包含而不限于的视图。它们都继承自QAbstractItemView类。QListViewQListWidgetQTableViewQTableWidgetQTreeViewQTreeWidget只看名字就应该知道它们都适用于哪些情况。List用于列表,table用于表格,tree用于树型。其中view系列比widget系列更加强大和灵活。ViewModel的连接在于setModel(arg_1)方法,与Delegate的连接在于setItemDelegate(delegate)方法,也可以指定相应的行(setItemDelegateForRow(row,delegate))或者列(setItemDelegateForColumn(column, delegate))。

Delegate

它主要用来帮助View的,因为View需要不仅要提供数据的显示,还需要提供边界输入等操作,并把更改的数据传回给Model,如果全部由View来完成,那么从结构上来说View这一块会显得很臃肿,责任划分不明确,所以出现了Delegate来帮助ViewDelegate提供了数据项的显示和编辑,并将编辑后的数据传回给ModelQAbstractItemDelegate是模型/视图框架中Delegate的抽象基类。 Delegate的实现默认由QStyledItemDelegate类提供,并且在标准视图中被认为默认的Delegate。 QItemDelegate类也是一种Delegate,它们之间的区别在于QStyledItemDelegate使用当前样式绘制其项目。 所以建议在实现自定义委托或使用Qt样式表时使用QStyledItemDelegate作为基类。

友情链接
QAbstractItemModel
QAbstractListModel
QAbstractTableModel
QAbstractItemView
QAbstractItemDelegate

相关文章

  • PySide2学习记录(十五):Model和View

    Python版本3.7PySide2 Version: 5.14.1官方文档:https://doc.qt.io/...

  • 我理解的angular双向绑定

    所谓双向,是指从model到view和从view到model。 View -> model相对直观,通过在view...

  • MVVM

    MVVM -Model View ViewModel ViewModel联系View和Model

  • MVP-登录

    View Presenter Model ,Presenter作为桥梁,持有view 和 model的接口引用,将...

  • MVC、MVVM

    MVC和MVVM都是用来分离model和view的MVC:model、view、controller MVVM:m...

  • Qt 模型/视图架构

    Qt Model/View 学习笔记很好的文章基本是对Qt Model/View文档的翻译总结:(转)Qt Mod...

  • day04

    Vue学习 1.MVVM模式:MVVM即:Model-View-View-Model模式。它由经典的软件架构MVC...

  • view持有Model,使用protocol

    view持有model的问题 view与model的耦合 有时view需要持有多个model,view中代码较多 ...

  • MV*初探

    还原真实的MV*模式 职责分离的思想Model + View MVC Controller处理Model和View...

  • QT Model

    1 Introduction to Model/View Programming The model/view a...

网友评论

    本文标题:PySide2学习记录(十五):Model和View

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