【PyQt学习篇 · ⑭】:QTableView的使用

文章目录

  • QTableView的使用
  • 示例

QTableView的使用

QTableView 是 PyQt 中用于显示表格数据的窗口部件,它提供了一个灵活的方式来显示和编辑数据。下面是一些关于 QTableView 的使用的具体信息:

  1. 创建 QTableView 对象:

    from PyQt5.QtWidgets import QApplication, QTableViewapp = QApplication([])  # 创建应用程序对象
    tableView = QTableView()  # 创建 QTableView 对象
    
  2. 设置数据模型:

    QTableView 依赖于数据模型来提供数据。常用的数据模型有 QStandardItemModelQAbstractTableModel。可以根据数据的不同复杂性来选择合适的数据模型。

    from PyQt5.QtGui import QStandardItemModel# 创建数据模型
    model = QStandardItemModel()# 设置表头
    model.setHorizontalHeaderLabels(["Column 1", "Column 2"])# 设置数据
    data = [["Row 1, Column 1", "Row 1, Column 2"],["Row 2, Column 1", "Row 2, Column 2"],# ...
    ]
    for i, row in enumerate(data):for j, value in enumerate(row):item = QStandardItem(value)model.setItem(i, j, item)# 将数据模型设置给 QTableView
    tableView.setModel(model)
    
  3. 显示 QTableView:

    tableView.show()
    
  4. 设置选择模式:

    from PyQt5.QtCore import QttableView.setSelectionMode(QTableView.SingleSelection)  # 单选模式
    tableView.setSelectionBehavior(QTableView.SelectRows)  # 选择整行
    tableView.setEditTriggers(QTableView.NoEditTriggers)  # 禁止编辑
    
  5. 获取选中的数据:

    selected_indexes = tableView.selectedIndexes()
    selected_values = []
    for index in selected_indexes:# 判断索引是否有效if index.isValid():value = index.data()selected_values.append(value)
    
  6. 其他常用操作:

    • 调整列宽:tableView.resizeColumnsToContents()
    • 调整行高:tableView.resizeRowsToContents()
    • 隐藏水平表头:tableView.horizontalHeader().setVisible(False)
    • 设置表格样式:tableView.setStyleSheet("QTableView { background-color: white; }")

示例

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItemclass MyWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("QTableView Example")# 创建数据模型self.model = QStandardItemModel(4, 3)self.model.setHorizontalHeaderLabels(["Name", "Age", "Gender"])# 添加数据data = [["Alice", "25", "Female"],["Bob", "32", "Male"],["Charlie", "42", "Male"],["Diana", "28", "Female"]]for row in range(len(data)):for col in range(len(data[row])):item = QStandardItem(data[row][col])self.model.setItem(row, col, item)# 创建 QTableViewself.table_view = QTableView()self.table_view.setModel(self.model)# self.table_view.setSelectionBehavior(QTableView.SelectRows)     # 设置 QTableView 控件的选择行为为选择整行(默认为选择单个单元格)self.table_view.setContextMenuPolicy(Qt.CustomContextMenu)      # 设置 QTableView 控件的上下文菜单的策略为自定义菜单策略,即用户可以通过customContextMenuRequested信号自定义显示菜单self.table_view.customContextMenuRequested.connect(self.show_context_menu)      # 将self.tabel_view控件的 custonContextMenuRequested 信号连接到自定义函数 show_context_menu 上,以便于显示自定义的上下文菜单# 设置表头自适应宽度self.table_view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)# 创建主布局,并将 QTableView 放入其中layout = QVBoxLayout()layout.addWidget(self.table_view)# 创建 QWidget,并将布局设置为其主布局central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)def show_context_menu(self, position):# 右键菜单menu = QMenu(self)# 删除行delete_action = QAction("Delete", self)delete_action.triggered.connect(self.delete_selected_row)# 添加行append_row_action = QAction('Append Row', self)append_row_action.triggered.connect(self.append_row)# 插入行insert_row_action = QAction('Insert Row', self)insert_row_action.triggered.connect(self.insert_row)# 获取值getValue_action = QAction('Get Value', self)getValue_action.triggered.connect(self.get_selected_values)menu.addActions([delete_action, append_row_action, insert_row_action, getValue_action])# 显示菜单menu.exec_(self.table_view.viewport().mapToGlobal(position))# 删除行def delete_selected_row(self):# 删除选中的行rows = sorted(set(index.row() for index in self.table_view.selectedIndexes()), reverse=True)for row in rows:self.model.removeRow(row)# 添加行def append_row(self):# 创建空的数据项empty_item = QStandardItem()self.model.appendRow([empty_item, empty_item, empty_item])# 插入行def insert_row(self):# 创建空的数据项empty_item = QStandardItem()# 获取当前选中的行selected_row = self.table_view.currentIndex().row()# 插入空行到选中行下方self.model.insertRow(selected_row + 1, [empty_item, empty_item, empty_item])def get_selected_values(self):selected_row, selected_column = self.table_view.currentIndex().row(), self.table_view.currentIndex().column()item = self.model.item(selected_row, selected_column)print(item.text())if __name__ == "__main__":app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec_())

运行结果:

在这里插入图片描述

  • 选中“Bob”,鼠标点击右键,点击“Delete”。
    在这里插入图片描述
  • 鼠标右键,点击“Append Row”
    在这里插入图片描述
  • 鼠标右键,点击“Insert Row”
    在这里插入图片描述
  • 鼠标右键,点击“Get Value”
    在这里插入图片描述

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

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

相关文章

python/C 生成beta分布的随机数

python/C 生成beta分布的随机数 文章目录 python/C 生成beta分布的随机数前言一、beta分布理论知识二、python 生成服从beta分布的随机数三、C语言生成服从beta分布的随机数 前言 想把一个算法用C语言实现,其中涉及到了beta分布取随机数,记录一下结果 一…

雀巢困在业绩和质量里

撰稿|行星 来源|贝多财经 雀巢集团CEO马克施奈德曾在2023年中报中表示,后疫情时代居家消费已恢复常态,从而消除了制约雀巢部分品类增长的阻碍。 但就雀巢前三季度财报而言,该公司在全球及大中华区的销售额均有所下降,有机增长主…

如何使用Java的GeoTools地理库计算WGS84坐标下的两个经纬度之间得距离

介绍 本章讲解如何使用Java的GeoTools地理库计算基于WGS84坐标的两点之间的距离。适用于后台服务的距离计算。 GeoTools介绍 GeoTools是开源的Java地理信息计算库。GeoServer地图引擎就是基于GeoTools库构建得地图服务,可以说非常强大。 官网地址:https://docs.geotools.o…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C#) Baumer工业相机Baumer工业相机通过SDK实现Raw格式的图像保存的技术背景通过SDK获取相机信息的代码分析Baumer工业相机回调函数里保存原始图像数据Baumer保存Raw图像格式重要核心代…

【JS】按照a>b>c>d>e>f的优先级,将a,b,c,d,e,f元素进行筛选,选出三个不为空字符的元素进行字符拼接

设计思路: 1、定义一个数组,把元素按照优先级进行排序; 2、 使用 filter() 方法过滤掉空字符串元素,得到一个新的数组; 3、在排序函数中,循环数组,使用 indexOf() 方法获取元素 a 和 b 在数组中的索引&a…

描述一个bug及定义bug的级别

(一)描述一个bug 描述一个bug,需要以下几个因素: 故障标题、故障发现的版本、故障类别(功能/兼容/界面)、故障优先级、故障描述(测试环境、测试步骤、预期结果、实际结果)。 举个例…

MySQL,使用Union组合查询

1、基本使用 Union可将多条select语句组合成一个结果集&#xff0c;常见的使用场景有2种&#xff1a; 在单个查询中&#xff0c;从不同的表返回类似结构的数据&#xff1b;对单个表执行多个查询&#xff0c;按单个查询返回数据。 例&#xff1a;检索出所有价格<50的产品&…

批发订货系统小程序怎么推广 四个方案高效获客

微信小程序基于强社交属性&#xff0c;天然自带引流特性&#xff0c;但毕竟小程序也只是一个工具&#xff0c;想要快速获客&#xff0c;还是需要商家主动采取一些措施的。下面分享是个方法&#xff0c;尤其是最后一个&#xff0c;是十分凑效的。大家点个关注点个赞&#xff0c;…

Android 权限申请

在Android中&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用在运行时需要动态申请权限。以下是一些步骤来动态申请权限&#xff1a; 在应用的清单文件&#xff08;AndroidManifest.xml&#xff09;中声明需要的权限。例如&#xff0c;如果应…

从零开发短视频电商 在AWS上用SageMaker部署自定义模型

文章目录 简介使用model.tar.gz1.从huggingface上下载模型2.自定义代码3.打包为tar 文件4.上传model.tar.gz到S35.部署推理 使用hub1.在sagemaker上新建个jupyterlab2.上传官方示例ipynb文件3.指定HF_MODEL_ID和HF_TASK进行部署和推理 inference.py官方示例 简介 原始链接&…

解决win10下强制设置web浏览器为microsoft edge的方法

目录 问题场景实现方法禁止edge默认选项设置默认浏览器 反思 问题场景 因为一些特殊的原因&#xff0c;我需要第二个浏览器&#xff0c;我的第一个浏览器是google的chrome浏览器&#xff0c;所以我选择的是windows的默认浏览器&#xff0c;就是microsoft edge浏览器&#xff0…

【Java】Mybatis

MyBatis JavaEE三层框架&#xff1a;表现层、业务层、持久层。 现在开始学习持久层。持久层就是负责与数据库打交道的代码。 框架&#xff1a;就是一个半成品软件。在框架的基础上&#xff0c;可以更加高效地写出代码。 1、MyBatis快速入门 1、准备工作&#xff08;创建sp…

【大模型】快速体验百度智能云千帆AppBuilder搭建知识库与小助手

文章目录 前言千帆AppBuilder什么是千帆AppBuilderAppBuilder能做什么 体验千帆AppBuilderJava知识库高考作文小助手 总结 前言 前天&#xff0c;在【百度智能云智算大会】上&#xff0c;百度智能云千帆AppBuilder正式开放服务。这是一个AI原生应用开发工作台&#xff0c;可以…

【C++入门到精通】互斥锁 (Mutex) C++11 [ C++入门 ]

阅读导航 引言一、Mutex的简介二、Mutex的种类1. std::mutex &#xff08;基本互斥锁&#xff09;2. std::recursive_mutex &#xff08;递归互斥锁&#xff09;3. std::timed_mutex &#xff08;限时等待互斥锁&#xff09;4. std::recursive_timed_mutex &#xff08;限时等待…

【沁恒蓝牙mesh】CH58x DataFlash 详解

本文主要介绍了 沁恒蓝牙芯片 CH58x 的 DataFlash 分区以及读写操作以及原理 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博…

CUMT--Java复习--JDBC编程

目录 一、JDBC简介 二、数据库访问 1、加载数据库驱动 2、建立数据连接 3、创建Statement对象 4、执行SQL语句 5、访问结果集 三、MetaData接口 1、DatabaseMetaData接口 2、ResultSetMetaData接口 四、事务 1、JDBC中的事务 2、保存点 3、批量更新 一、JDBC简…

韵达快递查询入口,一键将退回件筛选出来

批量查询韵达快递单号的物流信息&#xff0c;并将退回件一键筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角的…

CSS-SVG-环形进度条

线上代码地址 <div class"circular-progress-bar"><svg><circle class"circle-bg" /><circle class"circle-progress" style"stroke-dasharray: calc(2 * 3.1415 * var(--r) * (var(--percent) / 100)), 1000" …

影响晶振频率稳定性的因素及解决方法

晶振作为电子设备中的核心元件&#xff0c;其频率稳定性对设备的性能和可靠性具有重要影响。晶发电子将介绍影响晶振频率稳定性的因素&#xff0c;并探讨相应的解决方法。 一、影响晶振频率稳定性的因素 频率&#xff1a;晶振的频率是影响其性能的最重要因素之一。在选择晶振…

初识Docker-什么是docker

Docker是一个快速交付应用、运行应用的技术 目录 一、Docker 二、运用场景 一、什么是Docker&#xff1f;它的作用是什么&#xff1f; Docker如何解决大型项目依赖关系复杂&#xff0c;不同组件依赖的兼容性问题? Docker允许开发中将应用、依赖、函数库、配置一起打包&…