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

news/2025/2/5 12:50:22/

目录

一、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/news/1569509.html

相关文章

传输层协议 UDP 与 TCP

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 前置复盘🦋 传输层🦋 再谈端口号🦋 端口号范围划分🦋 认识知名端口号 (Well-Know Port Number) 二&#xf…

[LeetCode] 字符串完整版 — 双指针法 | KMP

字符串 基础知识双指针法344# 反转字符串541# 反转字符串II54K 替换数字151# 反转字符串中的单词55K 右旋字符串 KMP 字符串匹配算法28# 找出字符串中第一个匹配项的下标#459 重复的子字符串 基础知识 字符串的结尾:空终止字符00 char* name "hello"; …

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步

会议官网:www.acvra.org 简介 2025年计算机视觉研究进展与应用(ACVRA 2025)将于2025年2月28-3月2日在中国广州召开,将汇聚世界各地的顶尖学者、研究人员和行业专家,聚焦计算机视觉领域的最新研究动态与应用成就。本次…

基于微信小程序的电子竞技信息交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写

springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库&am…

list容器(详解)

list的介绍及使用(了解,后边细讲) 1.1 list的介绍(双向循环链表) https://cplusplus.com/reference/list/list/?kwlist(list文档介绍) 1. list是可以在常数范围内在任意位置进行插入和删除的序…

算法题(57):找出字符串中第一个匹配项的下标

审题: 需要我们根据原串与模式串相比较并找到完全匹配时子串的第一个元素索引,若没有则返回-1 思路: 方法一:BF暴力算法 思路很简单,我们用p1表示原串的索引,p2表示模式串索引。遍历原串,每次遍历都匹配一次…

[ Javascript ] WebStorm Create Node+TypeScript Project

文章目录 Install Npm and NodeCreate an Empty ProjectCreate TS ConfigInit Npm EnvironmentInstall Common ModulesCreate JS FileRun JS FileCreate TS FileCompile TS Into JSRun TS File Through Command LineRun TS File Through WebStormInclude TS File Into JS File …