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(委托)
,它将提供数据的编辑,并将编辑后的数据传递给模型,如下图所示。
先看一个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
用于存储表格类数据,不可直接使用。它的子类有QSqlQueryModel
,QSqlTableModel
和QSqlRelationalTableModel
。
QStandardItemModel
用于管理更复杂结构的数据,比如表格,树型等。
QFileSystemModel
用于提供本地文件系统中的文件和目录方面的信息。
QSqlQueryModel
,QSqlTableModel
和QSqlRelationalTableModel
用于处理数据库里面的数据。
当然我们也可以自己继承QAbstractItemModel
,QAbstractListModel
和QAbstractTableModel
来实现自己的Model。
View
视图主要用来展示数据,但也包含了delegate。Qt为我们提供了以下包含而不限于的视图。它们都继承自QAbstractItemView
类。QListView
,QListWidget
,QTableView
,QTableWidget
,QTreeView
,QTreeWidget
只看名字就应该知道它们都适用于哪些情况。List用于列表,table用于表格,tree用于树型。其中view系列比widget系列更加强大和灵活。View
与Model
的连接在于setModel(arg_1)
方法,与Delegate
的连接在于setItemDelegate(delegate)
方法,也可以指定相应的行(setItemDelegateForRow(row,delegate)
)或者列(setItemDelegateForColumn(column, delegate)
)。
Delegate
它主要用来帮助View
的,因为View
需要不仅要提供数据的显示,还需要提供边界输入等操作,并把更改的数据传回给Model
,如果全部由View
来完成,那么从结构上来说View
这一块会显得很臃肿,责任划分不明确,所以出现了Delegate
来帮助View
。Delegate
提供了数据项的显示和编辑,并将编辑后的数据传回给Model
。QAbstractItemDelegate
是模型/视图框架中Delegate的抽象基类。 Delegate的实现默认由QStyledItemDelegate
类提供,并且在标准视图中被认为默认的Delegate。 QItemDelegate
类也是一种Delegate,它们之间的区别在于QStyledItemDelegate
使用当前样式绘制其项目。 所以建议在实现自定义委托或使用Qt样式表时使用QStyledItemDelegate
作为基类。
友情链接
QAbstractItemModel
QAbstractListModel
QAbstractTableModel
QAbstractItemView
QAbstractItemDelegate