PyQt5 中的 List View

文章目录

    • 1. 基础概念
    • 2. 创建 List View
      • 2.1 PyQt5 中一个简单的 List View 实例
      • 2.2 代码解释
      • 2.3 运行结果
    • 3. 数据模型
      • 3.1 标准模型
      • 3.2 自定义模型
    • 4. 自定义 List View
      • 4.1 使用样式表 (QSS)
      • 4.2 设置项委托 (Item Delegate)
    • 5.事件处理
    • 6. 与数据交互
      • 6.1 添加数据
      • 6.2 删除数据
      • 6.3 编辑数据
      • 6.4 完整示例
    • 7. 排序与过滤
    • 8. 总结

1. 基础概念

  • 用途
    • List View 是 PyQt5 中用于显示列表数据的重要组件之一。它可以在界面上以列表的形式展示多行数据,通常用于显示诸如文件列表、联系人列表、日程安排等等的数据。
  • 特性
    • List View 具有灵活的布局和显示方式,可以根据需要进行自定义。它支持多种交互方式,比如点击、双击、拖拽等。同时,List View 也支持排序、过滤、编辑等功能,使用户能够更方便地管理和操作列表中的数据。
  • 基本工作原理
    • List View 基于模型-视图架构工作。它通过与数据模型进行交互来显示数据,并且可以使用不同的模型来管理不同类型的数据。List View 通过视图部件以及布局来展示数据,并通过委托来控制每个数据项的显示方式。
  • 视图和模型
    • 在 PyQt5中,List View 是视图(View)部件,用于显示数据;而数据模型(Model)则负责管理数据的存储和操作。通常情况下,可以使用 PyQt5 提供的标准模型(如 QStandardItemModel)来管理数据,也可以自定义模型来满足特定需求。
  • 定制化
    • List View 可以通过设置不同的属性和样式来进行定制化,比如调整行高、列宽、文本颜色、背景色等。此外,还可以通过设置委托(Delegate)来实现更高级的定制化,比如自定义每个数据项的显示方式或交互方式。

2. 创建 List View

2.1 PyQt5 中一个简单的 List View 实例

​ 下面我们用PyQt5 创建一个简单的 List View 实例,并展示一些静态数据

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView
from PyQt5.QtCore import QStringListModelclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()# 设置窗口标题和大小self.setWindowTitle("Simple List View Example")self.resize(500, 300)# 创建数据模型并填充数据data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]self.model = QStringListModel()self.model.setStringList(data)# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)if __name__ == "__main__":# 创建应用程序对象app = QApplication(sys.argv)# 创建主窗口对象window = MyMainWindow()# 显示主窗口window.show()# 进入应用程序的主事件循环sys.exit(app.exec_())

2.2 代码解释

  • from PyQt5.QtCore import QStringListModel: 导入 PyQt5 中的 QStringListModel 类,用于管理 List View 的数据模型。
  • self.setWindowTitle("Simple List View Example"): 设置主窗口的标题。
  • self.resize(500, 300): 设置主窗口的大小为宽度 500 像素、高度 300 像素。
  • data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]: 定义一个包含静态数据的列表。
  • self.model = QStringListModel(): 创建一个 QStringListModel 对象,用于管理 List View 的数据模型。
  • self.model.setStringList(data): 将静态数据添加到数据模型中。
  • self.list_view = QListView(): 创建一个 QListView 对象,用于显示数据列表。
  • self.list_view.setModel(self.model): 将数据模型设置为 List View 的模型。
  • layout = QVBoxLayout(): 创建一个垂直布局管理器。
  • layout.addWidget(self.list_view): 将 List View 添加到布局中。
  • central_widget = QWidget(): 创建一个 QWidget 对象作为主窗口的中央部件。
  • central_widget.setLayout(layout): 将布局设置为中央部件的布局。
  • self.setCentralWidget(central_widget): 将中央部件设置为主窗口的中央部件。

2.3 运行结果

在这里插入图片描述

3. 数据模型

在 PyQt5 中,数据模型是一种用于管理 List View 中数据的重要概念。数据模型负责存储、组织和操作列表视图中显示的数据。PyQt5 提供了两种主要类型的数据模型:标准模型和自定义模型。

3.1 标准模型

  • PyQt5 提供了一些标准的数据模型类,最常用的是 QStandardItemModel 和 QStringListModel。

  • QStandardItemModel:适用于一般的数据展示,可以存储各种类型的数据,每个数据项都可以包含文本、图标等内容。

  • QStringListModel:专门用于管理字符串列表的数据模型,可以方便地将字符串列表显示在 List View 中。

    from PyQt5.QtCore import QStringListModel# 创建 QStringListModel 数据模型
    model = QStringListModel()# 填充数据到模型中
    data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]
    model.setStringList(data)

3.2 自定义模型

  • 有时候,标准模型可能无法满足特定的需求,这时可以自定义数据模型。

  • 自定义模型需要继承自 QAbstractItemModel 类,并实现一些关键的方法,如 data()、rowCount()、columnCount() 等,以便 List View 能够正确地显示数据。

    from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt# 自定义数据模型类
    class CustomModel(QAbstractItemModel):def __init__(self, data, parent=None):super().__init__(parent)self.data = datadef rowCount(self, parent=QModelIndex()):return len(self.data)def columnCount(self, parent=QModelIndex()):return 1def data(self, index, role=Qt.DisplayRole):if role == Qt.DisplayRole:return self.data[index.row()]return None# 使用自定义模型
    data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]
    model = CustomModel(data)
    

4. 自定义 List View

在 PyQt5 中,自定义 List View 的外观和行为可以通过多种方式实现,包括使用样式表 (QSS)、设置项委托 (Item Delegate) 以及直接修改 List View 的属性。

4.1 使用样式表 (QSS)

样式表类似于 CSS,可以用于修改控件的外观。

from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView
from PyQt5.QtCore import QStringListModel
import sysclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Custom List View Example")self.resize(500, 300)# 创建数据模型并填充数据data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]self.model = QStringListModel()self.model.setStringList(data)# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)# 使用样式表自定义 List View 的外观self.list_view.setStyleSheet("""QListView {background-color: #f0f0f0;alternate-background-color: #e0e0e0;padding: 10px;}QListView::item {height: 40px;}QListView::item:selected {background-color: #a0a0ff;color: white;}""")# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

结果如下:

在这里插入图片描述

4.2 设置项委托 (Item Delegate)

项委托可以自定义每个项的绘制和编辑行为。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView, QStyledItemDelegate, QStyle
from PyQt5.QtCore import QStringListModel, QRect, QSize, Qt
from PyQt5.QtGui import QPainter, QColor, QFontclass CustomDelegate(QStyledItemDelegate):def paint(self, painter, option, index):painter.save()# 获取当前项的矩形区域rect = option.rect# 检查项的选择状态并设置相应的背景颜色if option.state & QStyle.State_Selected:painter.fillRect(rect, QColor("#D3D3D3"))  # 灰色背景else:painter.fillRect(rect, QColor("#FFFFFF"))  # 白色背景# 获取要显示的文本text = index.data()# 设置自定义字体和颜色font = QFont("Arial", 14)painter.setFont(font)painter.setPen(QColor("#000000"))  # 黑色字体# 绘制文本painter.drawText(rect, Qt.AlignLeft | Qt.AlignVCenter, text)painter.restore()def sizeHint(self, option, index):# 自定义每个项的高度return QSize(option.rect.width(), 40)class MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Custom List View Example")self.resize(500, 300)# 创建数据模型并填充数据data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]self.model = QStringListModel()self.model.setStringList(data)# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)# 设置自定义委托self.list_view.setItemDelegate(CustomDelegate())# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

5.事件处理

  • 下面例子处理 List View 中的点击事件。

    import sys
    from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView, QMessageBox
    from PyQt5.QtCore import QStringListModelclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("List View Event Handling Example")self.resize(300, 200)# 创建数据模型并填充数据data = ["Apple", "Banana", "Orange", "Grapes", "Pineapple"]self.model = QStringListModel()self.model.setStringList(data)# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)# 连接 List View 的点击事件到相应的处理函数self.list_view.clicked.connect(self.on_item_clicked)# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)def on_item_clicked(self, index):# 获取点击项的文本item_text = index.data()# 显示消息框QMessageBox.information(self, "Item Clicked", f"You clicked: {item_text}")if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

    运行结果如下:

    在这里插入图片描述

6. 与数据交互

​ 当与 PyQt5 中的 QListView 进行交互时,可以通过操作数据模型来实现添加、删除和编辑数据等操作。

6.1 添加数据

​ 要向 List View 中添加数据,可以直接修改数据模型。例如,对于 QStringListModel,可以使用 insertRows 方法或 append 方法添加新项。

# 创建数据模型
model = QStringListModel()# 添加新项
new_item = "New Item"
model.insertRows(model.rowCount(), 1)
model.setData(model.index(model.rowCount() - 1), new_item)

6.2 删除数据

​ 删除数据与添加数据类似,也是通过操作数据模型来实现。对于 QStringListModel,可以使用 removeRows 方法删除指定位置的项。

# 删除选定项
selected_index = list_view.selectedIndexes()[0]
model.removeRows(selected_index.row(), 1)

6.3 编辑数据

​ 要编辑 List View 中的数据,需要捕获用户的编辑动作,并更新相应的数据模型。可以通过重载委托类的 setEditorDatasetModelData 方法来实现。

class CustomDelegate(QStyledItemDelegate):def setEditorData(self, editor, index):# 获取当前项的文本text = index.data()# 将文本设置到编辑器中editor.setText(text)def setModelData(self, editor, model, index):# 获取编辑器中的文本text = editor.text()# 更新数据模型model.setData(index, text)

6.4 完整示例

下面是一个完整的示例,演示如何使用 PyQt5 实现添加、删除和编辑 List View 中的数据

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView, QPushButton, QLineEdit, QMessageBox, QStyledItemDelegate
from PyQt5.QtCore import QStringListModel, Qtclass CustomDelegate(QStyledItemDelegate):def setEditorData(self, editor, index):# 获取当前项的文本text = index.data()# 将文本设置到编辑器中editor.setText(text)def setModelData(self, editor, model, index):# 获取编辑器中的文本text = editor.text()# 更新数据模型model.setData(index, text)class MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("List View Interaction Example")self.resize(300, 200)# 创建数据模型并填充数据self.model = QStringListModel()self.model.setStringList(["Apple", "Banana", "Orange"])# 创建 List View 实例并设置数据模型self.list_view = QListView()self.list_view.setModel(self.model)self.list_view.setItemDelegate(CustomDelegate())# 创建按钮和文本框self.add_button = QPushButton("Add")self.remove_button = QPushButton("Remove")self.edit_text = QLineEdit()self.add_button.clicked.connect(self.add_item)self.remove_button.clicked.connect(self.remove_item)# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.list_view)layout.addWidget(self.add_button)layout.addWidget(self.remove_button)layout.addWidget(self.edit_text)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)def add_item(self):# 获取要添加的文本new_item = self.edit_text.text().strip()if new_item:# 添加新项到数据模型self.model.insertRows(self.model.rowCount(), 1)self.model.setData(self.model.index(self.model.rowCount() - 1), new_item)# 清空文本框self.edit_text.clear()else:QMessageBox.warning(self, "Warning", "Please enter a valid item.")def remove_item(self):# 获取选定项的索引selected_indexes = self.list_view.selectedIndexes()if selected_indexes:# 删除选定项self.model.removeRows(selected_indexes[0].row(), 1)else:QMessageBox.warning(self, "Warning", "Please select an item to remove.")if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

7. 排序与过滤

在 PyQt5 中,可以通过使用 QSortFilterProxyModel 类来实现 List View 的排序和过滤功能。这个类可以作为数据模型的中介,允许对模型中的数据进行排序和过滤,而不改变原始模型的数据。下面是如何在 List View 中实现排序和过滤功能的简要步骤:

步骤概览

  1. 创建原始数据模型:通常使用 QStringListModel 或自定义的模型类。
  2. 创建 QSortFilterProxyModel 对象,并将原始数据模型设置为其源模型。
  3. QSortFilterProxyModel 设置为 List View 的模型。
  4. 设置 QSortFilterProxyModel 的排序和过滤规则。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QListView, QLineEdit, QLabel, QSortFilterProxyModel
from PyQt5.QtCore import QStringListModelclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("List View Sorting and Filtering Example")self.resize(300, 200)# 创建原始数据模型并填充数据self.original_model = QStringListModel()self.original_model.setStringList(["Apple", "Banana", "Orange", "Grapes", "Pineapple"])# 创建排序和过滤代理模型self.proxy_model = QSortFilterProxyModel()self.proxy_model.setSourceModel(self.original_model)# 创建 List View 实例并设置模型为代理模型self.list_view = QListView()self.list_view.setModel(self.proxy_model)# 创建文本框和标签用于输入和显示过滤文本self.filter_edit = QLineEdit()self.filter_edit.textChanged.connect(self.filter_items)self.filter_label = QLabel("Filter:")# 创建主窗口布局layout = QVBoxLayout()layout.addWidget(self.filter_label)layout.addWidget(self.filter_edit)layout.addWidget(self.list_view)# 创建主窗口部件并设置布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)def filter_items(self):# 获取过滤文本filter_text = self.filter_edit.text()# 设置过滤正则表达式self.proxy_model.setFilterRegExp(filter_text)if __name__ == "__main__":app = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec_())

运行结果如下:

在这里插入图片描述

8. 总结

在这篇文章中,我们涵盖了 PyQt5 中 QListView 的各种功能和用法,包括List View 的基本概念,展示了如何使用 PyQt5 创建一个简单的 List View 实例,介绍了如何使用数据模型来管理 List View 中的数据,包括标准模型(如 QStringListModel)和自定义模型,我们讨论了如何自定义 List View 的外观和行为,包括调整行高、列宽、背景色等。我们介绍了如何设置项委托,以自定义 List View 中项的编辑器和显示器。我们讨论了如何处理 List View 中的事件,例如点击,并为这些事件添加相应的处理函数。我们展示了如何在 List View 中实现添加、删除、编辑数据等操作,以及如何使用自定义委托类来编辑数据。最后,我们介绍了如何使用 QSortFilterProxyModel 类来实现 List View 的排序和过滤功能,使用户能够更轻松地查找和管理数据。

总的来说,通过这些内容,读者可以了解到如何有效地使用 PyQt5 中的 QListView 组件,并根据自己的需求进行定制和扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707359.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA入门】Day05 - 面向对象

【JAVA入门】Day05 - 面向对象 文章目录 【JAVA入门】Day05 - 面向对象一、对象的设计和使用1.1 类和对象1.2 类的分类 二、封装三、private 关键字四、this 关键字五、构造方法六、JavaBean七、对象的内存图7.1 一个对象的内存图7.2 两个对象的内存图7.3 两个引用指向同一个对…

后仿真中的关于延时问题(如何指定延时模式)

了解到这里,大家可能会有个疑问:据我们常见,一个模块中不仅包含specify块,还会包含大量的门单元等语句。我们通常在specify块中会指定模块路径延迟, 模块内的路径单元(基本的门级单元、开关级元件或者子模块)又存在分布延迟,。 模块中这两种延迟经常会共存,那么此时进行仿真…

Cadence 16.6 PCB Edito如何将鼠标中键反向拉拽改为正向拖拽

Cadence 16.6 PCB Editor如何将鼠标中键反向拉拽改为正向拖拽 Cadence 16.6 PCB Editor默认鼠标中键是反向的拉拽,让我很不适应,在网上找的可行的方法,在这里总结出来,希望能帮到其他工程师。 按照以下步骤进行操作: …

TypeScript基础知识:TypeScript是什么?为什么会出现TypeScript?TypeScript相较于javascript有那些优势?

TypeScript(简称:TS)是JavaScript的超集(JS有的TS 都有)。 图解就是: TypeScriptType javaScript(在JS 基础之上,为JS 添加了类型支持)。 TypeScript 是微软开发的开源编程语言,可以在任何运行JavaScript的地方运行。 那么为什么要出现type…

LLMjacking:针对云托管AI大模型服务的新型攻击

Sysdig威胁研究团队(TRT)观察到一种新型攻击,命名为LLMjacking。它利用窃取的云凭证,对托管在云上的十个大型语言模型(LLM)服务发起攻击。 这些凭证是从一个流行的目标获得,即运行着一个存在漏洞的Laravel版本(CVE-2021-3129&…

Media Encoder 2024 for Mac:专业的音视频编码神器

Media Encoder 2024 for Mac,作为Mac用户的专业音视频编码工具,凭借其强大的功能和用户友好的界面,深受专业人士的喜爱。它支持将各种格式的音视频素材转换为多种流行格式,如MP4、MOV、AVI等,满足不同的播放和发布需求…

C# WinForm —— 16 MonthCalendar 介绍

1. 简介 可以选择单个日期,也可以选择一段日期,在选择时间范围上 比较适用,但不能跨月份选择日期范围 在直观上,可以快速查看、选择日期/日期范围 2. 常用属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般…

【Python探索之旅】字典

字典的基本特性 创建字典 修改字典 添加键值对 删除键值对 字典方法 遍历字典 完结撒花​ 前言 字典是 Python 中内建的一种具有弹性储存能力的数据结构,可存储任意类型对象,与序列使用整数索引不同,它使用键(key)进行索引。 通常任何不…

CSS三大选择器

CSS三大选择器 1 元素选择器2 id选择器3 class选择器 1 元素选择器 说明 根据标签名确定样式的作用范围语法为 元素名 {}样式只能作用到同名标签上,其他标签不可用相同的标签未必需要相同的样式,会造成样式的作用范围太大 代码 <head><meta charset"UTF-8&quo…

浅析张量分解(Tensor Decomposition)

文章目录 Q&A矩阵分解方法 B a s i c Basic Basic M F MF MF&#xff08;Basic Matrix Factorization&#xff09; R e g u l a r i z e d Regularized Regularized M F MF MFRegularized MF的数学推导Regularized MF 的迭代更新公式【具体理论&#xff1a;[梯度下降理论…

Java小游戏之汤姆猫

背景&#xff1a; 博主写过羊了个羊小游戏&#xff0c;客户觉得羊了个羊同学写过了&#xff0c;想换一个&#xff0c;于是笔者想到了汤姆猫。就是那个以前在苹果手机上的猫。 过程&#xff1a; 初始会有一个猫的图片展示&#xff0c;然后你点击按钮&#xff0c;猫会有不同动作…

车载以太网自动化测试套件(SOME/IP)- AETP. TC8 SOME/IP

概述 SOME/IP (Scalable service-Oriented Middleware over IP) 作为车载以太网的一种通信协议&#xff0c;在智能汽车通信领域受到广泛应用。对于应用SOME/IP协议的车内控制器来说&#xff0c;标准化的测试能够为车内通信提供更加可靠的保障。 AETP&#xff08;Automotive E…