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

server/2025/2/5 21:30:34/

目录

一、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/server/165237.html

相关文章

OpenAI发布最新推理模型o3-mini

OpenAI于周五推出了新的AI"推理"模型o3-mini,这是该公司o系列推理模型家族的最新成员。 OpenAI此前在12月份就预告过这个模型,同时还展示了一个能力更强的系统o3。此次发布恰逢OpenAI面临诸多机遇与挑战的关键时刻。 目前,OpenAI…

(1)Linux高级命令简介

Linux高级命令简介 在安装好linux环境以后第一件事情就是去学习一些linux的基本指令,我在这里用的是CentOS7作演示。 首先在VirtualBox上装好Linux以后,启动我们的linux,输入账号密码以后学习第一个指令 简介 Linux高级命令简介ip addrtou…

C++和Python实现SQL Server数据库导出数据到S3并导入Redshift数据仓库

用C实现高性能数据处理,Python实现操作Redshift导入数据文件。 在Visual Studio 2022中用C和ODBC API导出SQL Server数据库中张表中的所有表的数据为CSV文件格式的数据流,用逗号作为分隔符,用双引号包裹每个数据,字符串类型的数据…

Android 9.0 mtk默认浏览器Browser下载app不能安装问题的解决办法

1.前言 在系统9.0的ROM定制化开发中,在开发mtk平台的时候,在系统默认浏览器Browser中发现在下载某些app的时候,结果显示的确实 在下载到内部存储的时候,点击安装的时候安装失败,所以就需要从Browser的下载流程中出发分析相关源码来实现具体的功能 2.mtk默认浏览器Browser…

使用python实现与本地ollama部署的deepseek对话

专栏总目录 按照ollama官方doc的example操作,没有成功与本地ollama上的deepseek-r1:1.5b通讯后,发现vscode可以调用本地ollama上的deepseek模型。 为了实现与ollama上的deepseek模型通讯,我使用wireshark对本地回环地址进行侦听后&#xff0c…

15JavaWeb——Maven高级篇

Maven高级 Web开发讲解完毕之后,我们再来学习Maven高级。其实在前面的课程当中,我们已经学习了Maven。 我们讲到 Maven 是一款构建和管理 Java 项目的工具。经过前面 10 多天 web 开发的学习,相信大家对于 Maven 这款工具的基本使用应该没什…

(动态规划路径基础 最小路径和)leetcode 64

视频教程 1.初始化dp数组&#xff0c;初始化边界 2、从[1行到n-1行][1列到m-1列]依次赋值 #include<vector> #include<algorithm> #include <iostream>using namespace std; int main() {vector<vector<int>> grid { {1,3,1},{1,5,1},{4,2,1}…

Shell基础:中括号的使用

在Shell脚本中&#xff0c;中括号&#xff08;[ ... ] 和 [[ ... ]]&#xff09;是一种常见的条件测试结构。它们用于进行文件类型检查、值比较以及逻辑判断。通过了解它们的不同特点和用法&#xff0c;能够帮助你编写更加高效、安全且易读的脚本。本文将详细介绍Shell中单中括…