python pyside2 QListWidget与QListView区别 作者:马育民 • 2025-09-18 22:48 • 阅读:10003 # 说明 `QListWidget` 和 `QListView` 都是 PySide2 中用于展示列表数据的控件,但它们的设计理念和适用场景有显著区别。 # 设计模式与架构 ### QListWidget 是 **封装好的"即开即用"控件**,内部集成了数据模型(`QListWidgetItem`)和视图功能,属于"视图-项"(View-Item)模式。 无需手动创建数据模型,直接操作列表项即可。 ### QListView 遵循 **MVC(模型-视图-控制器)设计模式**,属于"视图-模型"(View-Model)模式。 本身仅负责展示,必须与外部数据模型(如 `QStandardItemModel`、`QAbstractListModel`)绑定才能使用。 # 核心差异对比 | **特性** | **`QListWidget`** | **`QListView`** | |------------------------|------------------------------------------------|----------------------------------------------| | **数据管理** | 自带数据模型,通过 `QListWidgetItem` 管理数据 | 依赖外部模型(如 `QStandardItemModel`) | | **灵活性** | 低(功能固定,定制受限) | 高(支持自定义模型、代理、样式) | | **易用性** | 简单(API直观,适合快速开发) | 复杂(需理解模型-视图交互) | | **性能** | 适合少量数据(如几十到几百项) | 适合大量数据(如几千到几万项,模型优化更好) | | **自定义项** | 支持基础定制(图标、文本、隐藏数据) | 支持深度定制(通过 `QItemDelegate` 自定义绘制)| | **适用场景** | 简单列表(如选项列表、文件列表) | 复杂列表(如动态数据、自定义样式、大数据量) | # 代码示例对比 ### QListWidget 用法(简单直接) ```python from PySide2.QtWidgets import QListWidget, QListWidgetItem # 创建列表控件 list_widget = QListWidget() # 直接添加项(内部自动管理数据) QListWidgetItem("项目1", list_widget) QListWidgetItem("项目2", list_widget) # 获取选中项 selected_item = list_widget.currentItem() print(selected_item.text()) # 直接操作项本身 ``` ### QListView 用法(需绑定模型) ```python from PySide2.QtWidgets import QListView from PySide2.QtGui import QStandardItemModel, QStandardItem # 创建列表视图 list_view = QListView() # 必须手动创建模型 model = QStandardItemModel() list_view.setModel(model) # 绑定模型 # 通过模型添加数据 model.appendRow(QStandardItem("项目1")) model.appendRow(QStandardItem("项目2")) # 获取选中项(通过模型获取数据) index = list_view.currentIndex() print(model.data(index)) # 通过模型索引获取数据 ``` # 如何选择? - **选 `QListWidget` 当**: - 需求简单(仅需添加、删除、显示列表项) - 开发速度优先,不想关注模型细节 - 数据量小(几百项以内) - **选 `QListView` 当**: - 需要自定义列表项样式(如复杂布局、动态效果) - 数据量大或需要动态更新(如实时数据展示) - 需复用数据模型(如同一数据在多个视图中展示) - 需实现高级功能(如拖放、筛选、排序逻辑定制) # 总结 `QListWidget` 是"傻瓜式"控件,适合快速实现简单列表;`QListView` 是"专业级"控件,通过与模型分离,提供更高的灵活性和性能,适合复杂场景。两者本质上是"封装程度"的差异,核心功能有重叠,但扩展性天差地别。 原文出处:http://malaoshi.top/show_1GW1szV1E6Ui.html