PySide2学习记录(十七):Model/View Programming

Python2.7 或 Python3.7
PySide2 Version: 5.11.2
官方文档:http://doc.qt.io/archives/qt-4.8/model-view-programming.html

什么是Model/View Programming,中文直译过来就是模型/视图编程。

Qt包含一系列的视图类(view class),它们使用模型/视图(model/view)架构来管理数据和数据如何显示给用户之间的关系。 这种方式为开发人员提供了更大的灵活性,用来自定义项目如何表示,并提供标准模型接口,允许将大量数据源与现有的视图一起使用。 简单来说,就是将数据和数据的表示进行了分离。

PySide2学习记录(十七):Model/View Programming_第1张图片
图1

先看第一部分,Model是与数据进行直接交互,比如取出数据,写入数据,这些操作是通过Model里面一系列接口实现的。
然后View通过Model里面的索引来获取Model里面的数据。也就是Model提供(render)给View数据。

再看第二部分,如果View里面需要修改提供的数据,并将这些数据给Model,然后存储起来怎么办,这时候就需要Delegate来实现了。当你编辑View中的数据,保存时,这些工作就是由Delegate来完成,并由Delegate来与Model进行通信,来完成数据的存储。

Models

所有的Models都基于QAbstractItemModel类,也就是说,如果需要自定义一个Model,就需要继承这个类。这个类定义了有关于View和Delegate用于访问数据的接口。 数据本身不存储在模型中,它可以保存在由单独的类,文件,数据库或某些其他应用程序提供的数据结构或存储库中。

有如下Qt内置的Model
QStringListModel用于存储QString项的简单列表。
QStandardItemModel管理更复杂的项结构树结构,每个结构都可以包含任意数据。
QFileSystemModel提供有关本地文件系统中的文件和目录的信息。
QSqlQueryModelQSqlTableModelQSqlRelationalTableModel用于使用模型/视图方式访问数据库。

Views

Qt为不同类型的视图提供了不同的完整的实现:
QListView列表视图
QTableView表格视图
QTreeView树型视图
这些类每一个都继承QAbstractItemView抽象类。

Delegates

QAbstractItemDelegate是模型/视图框架中Delegate的抽象基类。 Delegate的实现默认由QStyledItemDelegate类提供,并且在标准视图中被认为默认的Delegate。 QItemDelegate类也是一种Delegate,它们之间的区别在于QStyledItemDelegate使用当前样式绘制其项目。 所以建议在实现自定义委托或使用Qt样式表时使用QStyledItemDelegate作为基类。

代码:

from PySide2 import QtGui, QtWidgets, QtCore
import sys


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

# 生成一个view
listview = QtWidgets.QListView(window)
# 生成一个model
model = QtCore.QStringListModel()

# model添加数据
model.setStringList(['1', '2', '3', '4', '5'])

# view设置model
listview.setModel(model)

layout = QtWidgets.QVBoxLayout(window)
layout.addWidget(listview)

window.setLayout(layout)
window.show()
sys.exit(app.exec_())

效果图:

PySide2学习记录(十七):Model/View Programming_第2张图片
图2

你可能感兴趣的:(PySide2学习记录(十七):Model/View Programming)