PyQt4学习笔记2】Qt 的 Model/View 架构

目录

[一、Model/View 架构](#一、Model/View 架构)

[1. Model/View 架构的核心思想](#1. Model/View 架构的核心思想)

[2. Model/View 架构的优势](#2. Model/View 架构的优势)

[3. 常见的 Model 和 View 类](#3. 常见的 Model 和 View 类)

模型类 (Model)

视图类 (View)

[4. 信号和槽机制](#4. 信号和槽机制)

[5. 示例代码](#5. 示例代码)

[6. 数据操作](#6. 数据操作)

设置数据(将特定位置的数据替换掉)

插入和删除数据

[7. 自定义模型](#7. 自定义模型)

[8. 总结](#8. 总结)

[二、Model/View 架构在 PyQt4 中是如何实现的?](#二、Model/View 架构在 PyQt4 中是如何实现的?)

[1. 模型类 (Model)](#1. 模型类 (Model))

[a. QStringListModel](#a. QStringListModel)

[b. QStandardItemModel](#b. QStandardItemModel)

[c. QSqlQueryModel 和 QSqlTableModel](#c. QSqlQueryModel 和 QSqlTableModel)

[d. QFileSystemModel](#d. QFileSystemModel)

[2. 自定义模型](#2. 自定义模型)

实现必要方法

[3. 视图类 (View)](#3. 视图类 (View))

视图与模型的绑定

视图的信号

[4. 委托类 (Delegate)](#4. 委托类 (Delegate))

现成的委托类

自定义委托

[5. 数据角色](#5. 数据角色)

常用数据角色

[6. 数据更新](#6. 数据更新)

例子

[7. 总结](#7. 总结)


Qt 的 Model/View 架构 是一个非常灵活且强大的设计模式,用于解耦数据存储(Model)和数据展示(View)。这种架构使得用户界面更加灵活、可维护,并且支持多种视图展示同一种数据。在 PyQt4 中,Model/View 架构同样是一个核心概念。

一、Model/View 架构

1. Model/View 架构的核心思想

Model/View 架构中,主要包含以下三个部分:

  1. Model(模型) :负责存储和管理数据。它不依赖于视图,可以独立存在。模型通过标准化的接口(如 QAbstractItemModel)与视图或委托交互。

  2. View(视图):负责展示数据。视图从模型中读取数据并将其以特定的格式(如表格、树、列表)展示给用户。

  3. Delegate(委托):可选组件,用于自定义视图中单元格的绘制和编辑逻辑。

2. Model/View 架构的优势

  • 解耦:数据存储和展示分离,方便维护和扩展。

  • 重用性:同一模型可以用于多种视图。

  • 灵活性:视图和委托可以自定义,适应不同的展示需求。

  • 直观性:数据存储和交互逻辑清晰。

3. 常见的 Model 和 View 类

模型类 (Model)

  1. QStringListModel:用于简单的字符串列表数据。

  2. QStandardItemModel:提供了一个通用的表格或树状结构数据模型。

  3. QSqlQueryModelQSqlTableModel:用于数据库查询和操作。

  4. QFileSystemModel:用于显示文件系统内容。

视图类 (View)

  1. QListView:用于显示一维列表数据。

  2. QTableView:用于显示二维表格数据。

  3. QTreeView:用于显示树状结构数据。

4. 信号和槽机制

Model/View 架构广泛使用了 Qt 的信号和槽机制,用于在模型和视图之间传递数据变化的通知。

  • 模型信号dataChanged()rowsInserted()rowsRemoved() 等。

  • 视图信号clicked()pressed()activated() 等。

5. 示例代码

以下是一个简单的 Model/View 架构示例,展示如何使用 QStandardItemModelQListView

python 复制代码
# -*- coding: utf-8 -*-
from PyQt4 import QtGui, QtCore
import sys

app = QtGui.QApplication(sys.argv)  # 创建应用程序

# 创建模型
model = QtGui.QStandardItemModel()
# 添加数据到模型
items = ["Item 1", "Item 2", "Item 3"]
for item in items:
    model.appendRow(QtGui.QStandardItem(item))

# 创建视图
view = QtGui.QListView()
view.setModel(model)
# 显示视图
view.setWindowTitle("Model/View Example")
view.show()


sys.exit(app.exec_())  # 运行应用程序

6. 数据操作

设置数据(将特定位置的数据替换掉)

python 复制代码
# 设置特定位置的数据
index = model.index(2, 1)
model.setData(index, "New Item 1", QtCore.Qt.EditRole)

插入和删除数据

python 复制代码
# 插入一行
model.insertRow(1, QtGui.QStandardItem("Inserted Item"))

# 删除第一行数据
model.removeRow(0)

7. 自定义模型

如果现有的模型类无法满足需求,可以自定义模型。自定义模型需要继承 QAbstractItemModel 并实现以下方法:

  • index(): 返回给定位置的索引。

  • parent(): 返回父级索引。

  • rowCount(): 返回行数。

  • columnCount(): 返回列数。

  • data(): 返回指定索引的数据。

  • setData(): 设置指定索引的数据。

8. 总结

Model/View 架构是 PyQt4 中一个非常重要的概念,适用于需要灵活展示和操作数据的场景。通过解耦数据存储和展示,它可以显著提高代码的可维护性和重用性。

二、Model/View 架构在 PyQt4 中是如何实现的?

在 PyQt4 中,Model/View 架构是通过一系列类和接口实现的,这些类和接口遵循 Qt 的 Model/View 设计模式,将数据存储(Model)、数据展示(View)和数据编辑(Delegate)分离。以下是 Model/View 架构在 PyQt4 中的实现方式和关键组件:

1. 模型类 (Model)

模型负责存储和管理数据。Qt 提供了几种现成的模型类,用户也可以自定义模型。

a. QStringListModel

from PyQt4 import QtGui
import sys

app = QtGui.QApplication(sys.argv)

model = QtGui.QStringListModel()
model.setStringList(["Item 1", "Item 2", "Item 3"])

view = QtGui.QListView()
view.setModel(model)
view.show()

sys.exit(app.exec_())
  • 用于存储和展示简单的字符串列表。

  • 适用于 QListView

b. QStandardItemModel

from PyQt4 import QtGui
import sys

app = QtGui.QApplication(sys.argv)

model = QtGui.QStandardItemModel(4, 2)  # 4 rows, 2 columns
for row in range(4):
    for column in range(2):
        item = QtGui.QStandardItem(f"Row {row}, Column {column}")
        model.setItem(row, column, item)

view = QtGui.QTableView()
view.setModel(model)
view.show()

sys.exit(app.exec_())
  • 用于存储和展示表格或树状结构的数据。

  • 适用于 QTableViewQTreeView

c. QSqlQueryModelQSqlTableModel

  • 用于与数据库交互,展示查询结果或表数据。

d. QFileSystemModel

  • 用于展示文件系统的内容。

2. 自定义模型

如果现成的模型类无法满足需求,可以继承 QAbstractItemModel 或其子类(如 QAbstractListModelQAbstractTableModel)并实现必要的方法。

实现必要方法

  • index(row, column, parent):返回指定位置的索引。

  • parent(index):返回父级索引。

  • rowCount(parent):返回行数。

  • columnCount(parent):返回列数。

  • data(index, role):返回指定索引和角色的数据。

  • setData(index, value, role):设置指定索引和角色的数据。

3. 视图类 (View)

视图负责展示数据。Qt 提供了几种标准视图类:

  1. QListView

    • 用于展示一维列表数据。
  2. QTableView

    • 用于展示二维表格数据。
  3. QTreeView

    • 用于展示树状结构数据。

视图与模型的绑定

view = QtGui.QListView()
view.setModel(model)

视图的信号

视图提供了多种信号,用于处理用户交互:

  • clicked(index):当用户点击某个项时发出。

  • pressed(index):当用户按下某个项时发出。

  • activated(index):当用户激活某个项时发出。

4. 委托类 (Delegate)

委托负责自定义视图中的项绘制和编辑逻辑。Qt 提供了一些现成的委托类(如 QItemDelegate),也可以自定义委托。

现成的委托类

QItemDelegate:提供了默认的绘制和编辑逻辑。

自定义委托

继承 QItemDelegateQAbstractItemDelegate,并重写以下方法:

  • paint(painter, option, index):自定义绘制逻辑。

  • createEditor(parent, option, index):创建编辑器。

  • setEditorData(editor, index):设置编辑器数据。

  • setModelData(editor, model, index):将编辑器数据写入模型。

5. 数据角色

Qt 使用数据角色(如 Qt.DisplayRoleQt.EditRole)来区分不同的数据用途。模型需要根据角色返回不同的数据。

常用数据角色
  • Qt.DisplayRole:视图用于展示的数据。

  • Qt.EditRole:视图用于编辑的数据。

  • Qt.BackgroundRole:项的背景颜色。

  • Qt.TextColorRole:项的文本颜色。

6. 数据更新

模型和视图通过信号和槽机制保持同步。当模型数据发生变化时,模型会发出信号(如 dataChanged()),视图捕获信号并更新显示。

例子
model.dataChanged.connect(lambda topLeft, bottomRight: print("Model data changed"))

7. 总结

在 PyQt4 中,Model/View 架构通过以下方式实现:

  1. 使用现成的模型类(QStringListModelQStandardItemModel 等)或自定义模型。

  2. 使用现成的视图类(QListViewQTableView 等)绑定模型。

  3. 使用委托类自定义项的绘制和编辑逻辑。

  4. 使用信号和槽机制同步模型和视图。

通过这种架构,数据存储和展示逻辑被彻底分离,使得应用程序更加灵活和可维护。


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

相关推荐
Lei活在当下23 分钟前
【尚未完成】【Android架构底层逻辑拆解】Google官方项目NowInAndroid研究(4)数据层的设计和实现之data
架构
炬火初现29 分钟前
Etcd的安装与使用
数据库·etcd
IT猿手38 分钟前
2025最新群智能优化算法:云漂移优化(Cloud Drift Optimization,CDO)算法求解23个经典函数测试集,MATLAB
开发语言·数据库·算法·数学建模·matlab·机器人
雷渊43 分钟前
深入分析理解mysql的MVCC
java·数据库·面试
银河小铁骑plus44 分钟前
Go学习笔记:基础语法6
笔记·学习·golang
Paparazi灬1 小时前
RocksDB写流程各种场景下的处理逻辑和线程交互时序
数据库
databook1 小时前
manim边学边做--线性变换的场景类
python·动效
AmazingKO1 小时前
【够用就好008】开新坑自学esb32烧录进军物联网和嵌入式
人工智能·python·物联网·chatgpt·github·方方上土·aigc创意人竹相左边
rocksun1 小时前
UNITTEST: PYTHON开发者内置的安全网
python
Lei活在当下1 小时前
【Android架构底层逻辑拆解】Google官方项目NowInAndroid研究(3)数据层的设计和实现之network
架构