Model-View-Delegate
模型视图委托(MVD)是PyQt中特有的设计模式,类似MVC设计模式,将MVC设计模式中的Controller当做MVD中的Delegate,两者的概念基本相同。不同的是委托不是独立存在,而是包含在视图里面。
模型视图委托设计模式中,模型负责存储和管理数据;视图负责显示数据,其中界面的框架和基础信息是视图负责,具体数据的显示是委托负责;委托不仅仅负责数据的显示,还有一个重要的功能是负责数据的编辑,如在视图中双击就可以编辑数据。
视图是怎么获取模型数据?首先初始化视图时需要给视图设置模型,然后通过坐标获取模型中对应位置的数据。
模型
数据的存储一般是列表,表格和树,不同的存储方式有不同的操作和管理方法,为了适应这种差异性,PyQt中提供了一种统一的操作方法,如下图所示:
对于列表数据:
- 根节点永远是NULL
- row递增,column是0
对于表结构:
- 根节点永远是NULL
- row和column递增
对于树结构:
- 根节点是NULL,父节点可变
- row递增,column是0
模型类:
- QStandardItemModel 通用存储,可以存储任意结构,最常用
- QStringListModel 存储一组字符串
- QDirModel 存储文件系统
- QSqlQueryModel 对SQL查询的结果进行封装
- QSqlTableModel 对SQL中的表格进行封装
例子:
import sys from PyQt5.QtCore import Qt from PyQt5.QtGui import QStandardItemModel, QStandardItem from PyQt5.QtWidgets import QApplication, QWidget, QTableView, QHBoxLayout class MyWidget(QWidget): def __init__(self): super(MyWidget, self).__init__() self.mode = QStandardItemModel() root = self.mode.invisibleRootItem() item1 = QStandardItem() item1.setData('1', Qt.DisplayRole) item2 = QStandardItem() item2.setData('2', Qt.DisplayRole) item3 = QStandardItem() item3.setData('3', Qt.DisplayRole) item4 = QStandardItem() item4.setData('4', Qt.DisplayRole) root.setChild(0, 0, item1) root.setChild(0, 1, item2) root.setChild(1, 0, item3) root.setChild(1, 1, item4) # 表结构存储 tableView = QTableView(self) tableView.setModel(self.mode) layout = QHBoxLayout() layout.addWidget(tableView) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) w = MyWidget() w.resize(500, 300) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_())
import sys from PyQt5.QtCore import Qt from PyQt5.QtGui import QStandardItemModel, QStandardItem from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QTreeView class MyWidget(QWidget): def __init__(self): super(MyWidget, self).__init__() self.mode = QStandardItemModel() root = self.mode.invisibleRootItem() item1 = QStandardItem() item1.setData('1', Qt.DisplayRole) item2 = QStandardItem() item2.setData('2', Qt.DisplayRole) item3 = QStandardItem() item3.setData('3', Qt.DisplayRole) item4 = QStandardItem() item4.setData('4', Qt.DisplayRole) # 树结构存储 root.setChild(0, 0, item1) item1.setChild(0, 0, item2) item1.setChild(1, 0, item3) item3.setChild(0, 0, item4) treeView = QTreeView(self) treeView.setModel(self.mode) layout = QHBoxLayout() layout.addWidget(treeView) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) w = MyWidget() w.resize(500, 300) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_())