PyQt5模型视图委托

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_())

视图

猜你喜欢

转载自www.cnblogs.com/chusiyong/p/12941212.html