目录
一、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
架构中,主要包含以下三个部分:
Model(模型):负责存储和管理数据。它不依赖于视图,可以独立存在。模型通过标准化的接口(如
QAbstractItemModel
)与视图或委托交互。View(视图):负责展示数据。视图从模型中读取数据并将其以特定的格式(如表格、树、列表)展示给用户。
Delegate(委托):可选组件,用于自定义视图中单元格的绘制和编辑逻辑。
2. Model/View 架构的优势
解耦:数据存储和展示分离,方便维护和扩展。
重用性:同一模型可以用于多种视图。
灵活性:视图和委托可以自定义,适应不同的展示需求。
直观性:数据存储和交互逻辑清晰。
3. 常见的 Model 和 View 类
模型类 (Model
)
QStringListModel
:用于简单的字符串列表数据。
QStandardItemModel
:提供了一个通用的表格或树状结构数据模型。
QSqlQueryModel
和QSqlTableModel
:用于数据库查询和操作。
QFileSystemModel
:用于显示文件系统内容。
视图类 (View
)
QListView
:用于显示一维列表数据。
QTableView
:用于显示二维表格数据。
QTreeView
:用于显示树状结构数据。
4. 信号和槽机制
Model/View
架构广泛使用了 Qt 的信号和槽机制,用于在模型和视图之间传递数据变化的通知。
模型信号:
dataChanged()
、rowsInserted()
、rowsRemoved()
等。视图信号:
clicked()
、pressed()
、activated()
等。
5. 示例代码
以下是一个简单的 Model/View
架构示例,展示如何使用 QStandardItemModel
和 QListView
:
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_())
-
用于存储和展示表格或树状结构的数据。
-
适用于
QTableView
和QTreeView
。
c. QSqlQueryModel
和 QSqlTableModel
-
用于与数据库交互,展示查询结果或表数据。
d. QFileSystemModel
-
用于展示文件系统的内容。
2. 自定义模型
如果现成的模型类无法满足需求,可以继承
QAbstractItemModel
或其子类(如QAbstractListModel
、QAbstractTableModel
)并实现必要的方法。实现必要方法
index(row, column, parent)
:返回指定位置的索引。
parent(index)
:返回父级索引。
rowCount(parent)
:返回行数。
columnCount(parent)
:返回列数。
data(index, role)
:返回指定索引和角色的数据。
setData(index, value, role)
:设置指定索引和角色的数据。
3. 视图类 (View
)
视图负责展示数据。Qt 提供了几种标准视图类:
QListView
:
用于展示一维列表数据。
QTableView
:
用于展示二维表格数据。
QTreeView
:
用于展示树状结构数据。
视图与模型的绑定
view = QtGui.QListView()
view.setModel(model)
视图的信号
视图提供了多种信号,用于处理用户交互:
clicked(index)
:当用户点击某个项时发出。
pressed(index)
:当用户按下某个项时发出。
activated(index)
:当用户激活某个项时发出。
4. 委托类 (Delegate
)
委托负责自定义视图中的项绘制和编辑逻辑。Qt 提供了一些现成的委托类(如 QItemDelegate
),也可以自定义委托。
现成的委托类
QItemDelegate
:提供了默认的绘制和编辑逻辑。
自定义委托
继承
QItemDelegate
或QAbstractItemDelegate
,并重写以下方法:
paint(painter, option, index)
:自定义绘制逻辑。
createEditor(parent, option, index)
:创建编辑器。
setEditorData(editor, index)
:设置编辑器数据。
setModelData(editor, model, index)
:将编辑器数据写入模型。
5. 数据角色
Qt 使用数据角色(如
Qt.DisplayRole
、Qt.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
架构通过以下方式实现:
使用现成的模型类(
QStringListModel
、QStandardItemModel
等)或自定义模型。使用现成的视图类(
QListView
、QTableView
等)绑定模型。使用委托类自定义项的绘制和编辑逻辑。
使用信号和槽机制同步模型和视图。
通过这种架构,数据存储和展示逻辑被彻底分离,使得应用程序更加灵活和可维护。
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。