PyQt6/PySide6 的 QTableView 类

QTableView 是 PyQt6 或 PySide6 库中用于显示二维表格数据的控件。它是一个非常强大且灵活的控件,适用于展示和编辑表格数据。QTableView 通常与 QAbstractItemModel 的子类(如 QStandardItemModel 或自定义模型)一起使用,以提供数据源。下面我将详细介绍 QTableView 的主要特性及其使用方法。

1. 基本概念

  • 表格视图:用于显示二维表格数据的控件。
  • 模型-视图架构QTableView 使用模型-视图架构,其中 QTableView 是视图部分,负责显示数据;而模型(如 QStandardItemModel)则负责管理数据。
  • 列和行:表格中的基本单位,由行和列组成。
  • 单元格:表格中的单个数据项。
  • 选择模式:控制用户如何选择单元格、行或列。
  • 排序:支持对表格数据进行排序。
  • 编辑模式:允许用户直接在表格中编辑数据。

2. 创建 QTableView 实例

要使用 QTableView,首先需要导入相应的库:

from PyQt6.QtWidgets import QApplication, QTableView, QVBoxLayout, QWidget, QPushButton
from PyQt6.QtGui import QStandardItemModel, QStandardItem
# 或者
from PySide6.QtWidgets import QApplication, QTableView, QVBoxLayout, QWidget, QPushButton
from PySide6.QtGui import QStandardItemModel, QStandardItem

接着创建一个窗口,并在其中添加 QTableView 控件:

class MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle("我的应用程序")self.setGeometry(100, 100, 800, 600)# 初始化UIself.initUI()def initUI(self):layout = QVBoxLayout()# 创建表格视图self.table_view = QTableView(self)# 创建模型self.model = QStandardItemModel(4, 3)  # 4行3列self.model.setHorizontalHeaderLabels(['姓名', '年龄', '职业'])# 添加数据self.model.setItem(0, 0, QStandardItem('张三'))self.model.setItem(0, 1, QStandardItem('28'))self.model.setItem(0, 2, QStandardItem('工程师'))self.model.setItem(1, 0, QStandardItem('李四'))self.model.setItem(1, 1, QStandardItem('32'))self.model.setItem(1, 2, QStandardItem('教师'))self.model.setItem(2, 0, QStandardItem('王五'))self.model.setItem(2, 1, QStandardItem('25'))self.model.setItem(2, 2, QStandardItem('医生'))self.model.setItem(3, 0, QStandardItem('赵六'))self.model.setItem(3, 1, QStandardItem('30'))self.model.setItem(3, 2, QStandardItem('律师'))# 设置模型到视图self.table_view.setModel(self.model)# 添加按钮button = QPushButton("打印选中项", self)button.clicked.connect(self.print_selection)# 添加到布局layout.addWidget(self.table_view)layout.addWidget(button)self.setLayout(layout)def print_selection(self):selected_indices = self.table_view.selectedIndexes()for index in selected_indices:row = index.row()column = index.column()value = index.data()print(f"行: {row}, 列: {column}, 值: {value}")if __name__ == "__main__":app = QApplication([])window = MyWindow()window.show()app.exec()

3. QTableView 的常用属性和方法

属性
  • model:获取或设置当前使用的模型。
  • selectionModel:获取或设置当前的选择模型。
  • currentIndex:获取或设置当前选中的索引。
  • horizontalHeader:获取水平表头。
  • verticalHeader:获取垂直表头。
  • cornerButtonEnabled:获取或设置是否启用角落按钮。
  • showGrid:获取或设置是否显示网格线。
  • gridStyle:获取或设置网格线样式。
  • alternatingRowColors:获取或设置是否交替行颜色。
  • sortingEnabled:获取或设置是否启用排序。
  • wordWrap:获取或设置是否启用自动换行。
  • resizeMode:获取或设置调整大小模式。
  • selectionBehavior:获取或设置选择行为(选择单元格、行或列)。
  • selectionMode:获取或设置选择模式(单选或多选)。
  • editTriggers:获取或设置编辑触发器。
  • toolTip:获取或设置工具提示文本。
  • statusTip:获取或设置状态栏提示文本。
方法
  • setModel(QAbstractItemModel):设置当前使用的模型。
  • model() -> QAbstractItemModel:获取当前使用的模型。
  • setSelectionModel(QItemSelectionModel):设置当前的选择模型。
  • selectionModel() -> QItemSelectionModel:获取当前的选择模型。
  • setCurrentIndex(QModelIndex):设置当前选中的索引。
  • currentIndex() -> QModelIndex:获取当前选中的索引。
  • horizontalHeader() -> QHeaderView:获取水平表头。
  • verticalHeader() -> QHeaderView:获取垂直表头。
  • setCornerButtonEnabled(bool):设置是否启用角落按钮。
  • isCornerButtonEnabled() -> bool:判断是否启用角落按钮。
  • setShowGrid(bool):设置是否显示网格线。
  • showGrid() -> bool:判断是否显示网格线。
  • setGridStyle(Qt.PenStyle):设置网格线样式。
  • gridStyle() -> Qt.PenStyle:获取网格线样式。
  • setAlternatingRowColors(bool):设置是否交替行颜色。
  • alternatingRowColors() -> bool:判断是否交替行颜色。
  • setSortingEnabled(bool):设置是否启用排序。
  • isSortingEnabled() -> bool:判断是否启用排序。
  • setWordWrap(bool):设置是否启用自动换行。
  • wordWrap() -> bool:判断是否启用自动换行。
  • setResizeMode(QHeaderView.ResizeMode):设置调整大小模式。
  • resizeMode() -> QHeaderView.ResizeMode:获取调整大小模式。
  • setSelectionBehavior(QAbstractItemView.SelectionBehavior):设置选择行为。
  • selectionBehavior() -> QAbstractItemView.SelectionBehavior:获取选择行为。
  • setSelectionMode(QAbstractItemView.SelectionMode):设置选择模式。
  • selectionMode() -> QAbstractItemView.SelectionMode:获取选择模式。
  • setEditTriggers(QAbstractItemView.EditTrigger):设置编辑触发器。
  • editTriggers() -> QAbstractItemView.EditTrigger:获取编辑触发器。
  • setToolTip(str):设置工具提示文本。
  • toolTip() -> str:获取工具提示文本。
  • setStatusTip(str):设置状态栏提示文本。
  • statusTip() -> str:获取状态栏提示文本。
  • selectRow(int):选择指定行。
  • selectColumn(int):选择指定列。
  • clearSelection():清除选择。
  • selectAll():全选。
  • selectedIndexes() -> List[QModelIndex]:获取所有选中的索引。
  • resizeColumnsToContents():根据内容调整列宽。
  • resizeRowsToContents():根据内容调整行高。
  • hideColumn(int):隐藏指定列。
  • showColumn(int):显示指定列。
  • hideRow(int):隐藏指定行。
  • showRow(int):显示指定行。

4. 详细示例

设置模型
# 创建模型
model = QStandardItemModel(4, 3)  # 4行3列
model.setHorizontalHeaderLabels(['姓名', '年龄', '职业'])# 添加数据
model.setItem(0, 0, QStandardItem('张三'))
model.setItem(0, 1, QStandardItem('28'))
model.setItem(0, 2, QStandardItem('工程师'))
model.setItem(1, 0, QStandardItem('李四'))
model.setItem(1, 1, QStandardItem('32'))
model.setItem(1, 2, QStandardItem('教师'))
model.setItem(2, 0, QStandardItem('王五'))
model.setItem(2, 1, QStandardItem('25'))
model.setItem(2, 2, QStandardItem('医生'))
model.setItem(3, 0, QStandardItem('赵六'))
model.setItem(3, 1, QStandardItem('30'))
model.setItem(3, 2, QStandardItem('律师'))# 设置模型到视图
table_view.setModel(model)
获取当前选中的索引
def print_selection():selected_indices = table_view.selectedIndexes()for index in selected_indices:row = index.row()column = index.column()value = index.data()print(f"行: {row}, 列: {column}, 值: {value}")
选择行或列
# 选择第1行
table_view.selectRow(1)# 选择第2列
table_view.selectColumn(2)
清除选择
table_view.clearSelection()
全选
table_view.selectAll()
根据内容调整列宽和行高
table_view.resizeColumnsToContents()
table_view.resizeRowsToContents()
隐藏和显示列或行
# 隐藏第2列
table_view.hideColumn(2)# 显示第2列
table_view.showColumn(2)# 隐藏第3行
table_view.hideRow(3)# 显示第3行
table_view.showRow(3)
启用或禁用排序
table_view.setSortingEnabled(True)  # 启用排序
table_view.setSortingEnabled(False)  # 禁用排序
设置选择行为
table_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)  # 选择整行
table_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectColumns)  # 选择整列
table_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectItems)  # 选择单元格
设置选择模式
table_view.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)  # 单选
table_view.setSelectionMode(QAbstractItemView.SelectionMode.ContiguousSelection)  # 连续多选
table_view.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)  # 扩展多选
table_view.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)  # 多选
设置编辑触发器
table_view.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked | QAbstractItemView.EditTrigger.SelectedClicked)  # 双击或选中后点击编辑
设置工具提示和状态栏提示
table_view.setToolTip("这是一个表格视图")
table_view.setStatusTip("查看和编辑数据")

5. 信号与槽机制

QTableView 支持多种信号,这些信号可以在用户交互时发射。常见的信号包括 clickeddoubleClickedpressedactivatedselectionChanged。你可以通过连接这些信号到槽函数来处理用户的输入事件。

def on_clicked(index):row = index.row()column = index.column()value = index.data()print(f"点击: 行: {row}, 列: {column}, 值: {value}")def on_double_clicked(index):row = index.row()column = index.column()value = index.data()print(f"双击: 行: {row}, 列: {column}, 值: {value}")def on_pressed(index):row = index.row()column = index.column()value = index.data()print(f"按下: 行: {row}, 列: {column}, 值: {value}")def on_activated(index):row = index.row()column = index.column()value = index.data()print(f"激活: 行: {row}, 列: {column}, 值: {value}")def on_selection_changed(selected, deselected):print("选择发生变化")table_view.clicked.connect(on_clicked)
table_view.doubleClicked.connect(on_double_clicked)
table_view.pressed.connect(on_pressed)
table_view.activated.connect(on_activated)
table_view.selectionModel().selectionChanged.connect(on_selection_changed)

6. 自定义样式

除了使用内置的样式设置外,你还可以通过样式表(QSS)来自定义 QTableView 的外观。样式表类似于CSS,提供了强大的样式控制能力。

table_view.setStyleSheet("""QTableView {background-color: #f0f0f0;alternate-background-color: #e0e0e0;selection-background-color: #0078d7;selection-color: white;gridline-color: #cccccc;border: 1px solid #cccccc;}QTableView::item {padding: 5px;}QTableView::item:selected {background-color: #0078d7;color: white;}QTableView::item:hover {background-color: #d0d0d0;}QTableView::item:focus {outline: none;}QHeaderView::section {background-color: #e0e0e0;border: 1px solid #cccccc;padding: 5px;}QHeaderView::section:checked {background-color: #0078d7;color: white;}
""")

7. 动态更新和控制

你可以动态地更新 QTableView 的内容,或者根据某些条件控制其行为。例如,在定时器或其他事件触发时更新表格的数据。

import time
from PyQt6.QtCore import QTimerclass MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle("我的应用程序")self.setGeometry(100, 100, 800, 600)# 初始化UIself.initUI()# 创建定时器self.timer = QTimer(self)self.timer.timeout.connect(self.update_table_view)self.timer.start(5000)  # 每5秒触发一次def initUI(self):layout = QVBoxLayout()# 创建表格视图self.table_view = QTableView(self)# 创建模型self.model = QStandardItemModel(4, 3)  # 4行3列self.model.setHorizontalHeaderLabels(['姓名', '年龄', '职业'])# 添加数据self.model.setItem(0, 0, QStandardItem('张三'))self.model.setItem(0, 1, QStandardItem('28'))self.model.setItem(0, 2, QStandardItem('工程师'))self.model.setItem(1, 0, QStandardItem('李四'))self.model.setItem(1, 1, QStandardItem('32'))self.model.setItem(1, 2, QStandardItem('教师'))self.model.setItem(2, 0, QStandardItem('王五'))self.model.setItem(2, 1, QStandardItem('25'))self.model.setItem(2, 2, QStandardItem('医生'))self.model.setItem(3, 0, QStandardItem('赵六'))self.model.setItem(3, 1, QStandardItem('30'))self.model.setItem(3, 2, QStandardItem('律师'))# 设置模型到视图self.table_view.setModel(self.model)# 添加到布局layout.addWidget(self.table_view)self.setLayout(layout)def update_table_view(self):# 更新模型数据self.model.clear()self.model.setHorizontalHeaderLabels(['姓名', '年龄', '职业'])# 添加新的数据self.model.setItem(0, 0, QStandardItem('张三'))self.model.setItem(0, 1, QStandardItem('29'))self.model.setItem(0, 2, QStandardItem('工程师'))self.model.setItem(1, 0, QStandardItem('李四'))self.model.setItem(1, 1, QStandardItem('33'))self.model.setItem(1, 2, QStandardItem('教师'))self.model.setItem(2, 0, QStandardItem('王五'))self.model.setItem(2, 1, QStandardItem('26'))self.model.setItem(2, 2, QStandardItem('医生'))self.model.setItem(3, 0, QStandardItem('赵六'))self.model.setItem(3, 1, QStandardItem('31'))self.model.setItem(3, 2, QStandardItem('律师'))if __name__ == "__main__":app = QApplication([])window = MyWindow()window.show()app.exec()

总结

QTableView 是 PyQt6/PySide6 中非常强大且灵活的控件,适用于各种需要展示和编辑表格数据的场景。通过设置不同的属性和使用样式表,你可以创建出丰富多样的表格视图样式。同时,通过信号与槽机制,你可以方便地处理用户的输入事件。希望以上内容能帮助你更好地理解和运用 QTableView,并能够根据具体需求创建出功能丰富且用户友好的表格视图控件。

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

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

相关文章

【嵌入式】C语言多文件编程与内联函数

文章目录 0 前言1 从C语言编译说起2 重复定义错误(ODR violation)和条件编译3 内联函数inline和static inline4 总结 0 前言 最近在研究ARM内核代码时,看到core_cm3.h中有大量的内联函数,为此查阅了很多资料,也和朋友讨…

10分钟本地部署Deepseek-R1

10分钟本地部署DeepSeek-R1 什么是DeepSeek-R1快速本地部署DeepSeek-R1Ollama下载Ollama安装检查是否安装成功 安装DeepSeek-R1模型模型使用测试 什么是DeepSeek-R1 DeepSeek-R1是中国的深度求索(DeepSeek)公司开发的智能助手。其具有极佳的语义理解和生…

Office / WPS 公式、Mathtype 公式输入花体字、空心字

注:引文主要看注意事项。 1、Office / WPS 公式中字体转换 花体字 字体选择 “Eulid Math One” 空心字 字体选择 “Eulid Math Two” 2、Mathtype 公式输入花体字、空心字 2.1 直接输入 花体字 在 mathtype 中直接输入 \mathcal{L} L \Large \mathcal{L} L…

【C++】STL——vector底层实现

目录 💕 1.vector三个核心 💕2.begin函数,end函数的实现(简单略讲) 💕3.size函数,capacity函数的实现 (简单略讲) 💕4.reserve函数实现 (细节…

7、怎么定义一个简单的自动化测试框架?

定义一个简单的自动化测试框架可以从需求理解、框架设计、核心模块实现、测试用例编写和集成执行等方面入手,以下为你详细介绍: 1. 明确框架需求和范围 确定测试类型:明确框架要支持的测试类型,如单元测试、接口测试、UI 测试等…

AI取代人类?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

C语言-----数据结构从门到精通

1.数据结构基本概念 数据结构是计算机中存储、组织数据的方式,旨在提高数据的访问和操作效率。它是实现高效算法和程序设计的基石。 目标:通过思维导图了解数据结构的知识点,并掌握。 1.1逻辑结构 逻辑结构主要四种类型: 集合:结构中的数据元素之…

华为小米vivo向上,苹果荣耀OPPO向下

日前,Counterpoint发布的手机销量月度报告显示,中国智能手机销量在2024年第四季度同比下降3.2%,成为2024年唯一出现同比下滑的季度。而对于各大智能手机品牌来说,他们的市场份额和格局也在悄然发生变化。 华为逆势向上 在2024年第…

每日一博 - 三高系统架构设计:高性能、高并发、高可用性解析

文章目录 引言一、高性能篇1.1 高性能的核心意义1.2 影响系统性能的因素1.3 高性能优化方法论1.3.1 读优化:缓存与数据库的结合1.3.2 写优化:异步化处理 1.4 高性能优化实践1.4.1 本地缓存 vs 分布式缓存1.4.2 数据库优化 二、高并发篇2.1 高并发的核心意…

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

基于RK3588/RK3576+MCU STM32+AI的储能电站电池簇管理系统设计与实现

伴随近年来新型储能技术的高质量规模化发展,储能电站作为新能源领域的重要载体, 旨在配合逐步迈进智能电网时代,满足电力系统能源结构与分布的创新升级,给予相应规模 电池管理系统的设计与实现以新的挑战。同时,电子系…

K8s 分布式存储后端(K8s Distributed Storage Backend)

K8s 分布式存储后端 在 K8s 中实现分布式存储后端对于管理跨集群的持久数据、确保高可用性、可扩展性和可靠性至关重要。在 K8s 环境中,应用程序通常被容器化并跨多个节点部署。虽然 K8s 可以有效处理无状态应用程序,但有状态应用程序需要持久存储来维护…

FFmpeg:多媒体处理的瑞士军刀

FFmpeg:多媒体处理的瑞士军刀 前言 FFmpeg 是一个功能强大且跨平台的开源多媒体框架,广泛应用于音视频处理领域。 它由多个库和工具组成,能够处理各种音视频格式,涵盖编码、解码、转码、流处理等多种操作。 无论是专业视频编辑…

unordered_map/set的哈希封装

【C笔记】unordered_map/set的哈希封装 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】unordered_map/set的哈希封装前言一. 源码及框架分析二.迭代器三.operator[]四.使用哈希表封装unordered_map/set后言 前言 哈…

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

​​ 系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编…

neo4j-community-5.26.0 install in window10

在住处电脑重新配置一下neo4j, 1.先至官方下载 Neo4j Desktop Download | Free Graph Database Download Neo4j Deployment Center - Graph Database & Analytics 2.配置java jdk jdk 21 官网下载 Java Downloads | Oracle 中国 path: 4.查看java -version 版本 5.n…

网络原理(5)—— 数据链路层详解

目录 一. 以太网 1.1 认识以太网 1.2 网卡与以太网 1.3 以太网帧格式 二. 认识MAC地址 三. MAC地址 与 IP地址 的区别 4.1 定义 4.2 分配方式 4.3 工作层次 4.4 地址格式 4.5 寻址方式 四. ARP协议 4.1 引入 4.2 ARP的概念 4.3 ARP工作原理 五. MTU 与 MSS …

【从零开始的LeetCode-算法】922. 按奇偶排序数组 II

给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。 你可以返回 任何满足上述条件的…

H264原始码流格式分析

1.H264码流结构组成 H.264裸码流(Raw Bitstream)数据主要由一系列的NALU(网络抽象层单元)组成。每个NALU包含一个NAL头和一个RBSP(原始字节序列载荷)。 1.1 H.264码流层次 H.264码流的结构可以分为两个层…

AI大模型(二)基于Deepseek搭建本地可视化交互UI

AI大模型(二)基于Deepseek搭建本地可视化交互UI DeepSeek开源大模型在榜单上以黑马之姿横扫多项评测,其社区热度指数暴涨、一跃成为近期内影响力最高的话题,这个来自中国团队的模型向世界证明:让每个普通人都能拥有媲…