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

devtools/2025/2/7 17:41:28/

目录

一、Model/View 架构

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

2. Model/View 架构的优势

3. 常见的 Model 和 View 类

模型类 (Model)

视图类 (View)

4. 信号和槽机制

5. 示例代码

6. 数据操作

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

        插入和删除数据

7. 自定义模型

8. 总结

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

1. 模型类 (Model)

a. QStringListModel

b. QStandardItemModel

c. QSqlQueryModel 和 QSqlTableModel

d. QFileSystemModel

2. 自定义模型

实现必要方法

3. 视图类 (View)

视图与模型的绑定

视图的信号

4. 委托类 (Delegate)

现成的委托类

自定义委托

5. 数据角色

        常用数据角色

6. 数据更新

        例子

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 sysapp = 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 sysapp = 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 sysapp = 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-------------------------

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


http://www.ppmy.cn/devtools/156885.html

相关文章

maxun爬虫机器人介绍与部署

软件介绍 机器人爬虫工具,绕开编码,直接从网页中截图并且进行解析 一款全新的无代码网页数据提取平台,无需编程即可轻松抓取网站的数据,支持列表/文本抓取、截图、自定义代理、自动处理分页和滚动等功能。作为一个新的开源项目&…

【C++】内存管理

【C】内存管理 前言: 这里的内存管理会跟C语言的进行区分比较,注意两者的区别。 一、内存区域划分 栈区:由编译器自动分配和释放,存放函数的参数值、非静态局部变量、返回值等,栈是向下增长的。堆区:用于…

VUE 集成企微机器人通知

message-robot 便于线上异常问题及时发现处理,项目中集成企微机器人通知,及时接收问题并处理 企微机器人通知工具类 export class MessageRobotUtil {constructor() {}/*** 发送 markdown 消息* param robotKey 机器人 ID* param title 消息标题* param…

如何在 Kafka 中实现自定义分区器

今天我来给大家分享一下如何在 Kafka 中实现一个自定义分区器。Kafka 是一个分布式流处理平台,能够高效地处理海量数据。默认情况下,Kafka 使用键的哈希值来决定消息应该发送到哪个分区,但是有时我们需要根据特定的业务逻辑来定制分区策略。这…

MySQL-mysql zip安装包配置教程

网上的教程有很多,基本上大同小异。但是安装软件有时就可能因为一个细节安装失败。我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的。 安装环境:win11 1、下载zip安装包: MySQL8.0 For Windows zip包下载地址…

Android 音视频编解码 -- MediaCodec

引言 如果我们只是简单玩一下音频、视频播放,那么使用 MediaPlayer SurfaceView 播放就可以了,但如果想加个水印,加点其他特效什么的,那就不行了; 学习 Android 自带的硬件码类 – MediaCodec。 MediaCodec 介绍 在A…

第五十八节 k8s1.30.x 安装Redis集群

一、环境准备 1.1 准备k8s集群 cat /etc/hosts --- 192.168.80.31 lyc-80-31 192.168.80.32 lyc-80-32 192.168.80.33 lyc-80-33系统版本Rocky linux 8.10 docker版本 26.1.3 k8s版本 v1.31.3集群已免密互信,初始化配置一设置,k8s集群已安装 1.2 准…

一篇关于高等数理统计结合机器学习论文的撰写(如何撰写?)

前言 在大学或者研究生阶段,大家可能都会遇到一个问题就是,在上高等数理统计课程时,老师总会让同学们写一些大作业,比如论文什么的,接下来我会从计算机领域的角度,带领大家开启一篇从0到1的高等数理统计文…