热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Pyqt5】QTableView添加复选框的一种方法

一、QTableView添加复选框网上查了下QTableView添加复选框有四种方法,都比较麻烦。https:blog.csdn.netliang19890820articlede

QTableView添加复选框

网上查了下QTableView添加复选框有四种方法,都比较麻烦。

https://blog.csdn.net/liang19890820/article/details/50718340


后来看到QStandardltem有setCheckable勾选方法,就想着利用该方法,单独生成一列Checkbox显示。并在选中某一行时将Checkbox勾选上,在勾选Checkbox时自动将某一行选上。

本身Checkbox是否勾选与该行是否选择是没有关联的,要找到关联就需要借助于信号。

QItemSelectionModel在选择的单元格改变时会自动发出selectionChanged信号,所以只需要选择改变时通过槽函数OnSelectionChanged设置对应行的Checkbox。通过QItemSelection获取QModelIndex列表,然后遍历列表中所有的QModelIndex,设置对应的Checkbox状态









QModelIndexList indexes() const 选择范围的QModelIndex单元格列表

  for item in selectlist.indexes():
            rowNum = item.row()
            # 0:Qt.Unchecked, 1:Qt.PartiallyChecked, 2:Qt.Checked
            self.targetItemModel.item(rowNum, 0).setCheckState(Qt.Checked)

        for item in deselectlist.indexes():
            rowNum = item.row()
            self.targetItemModel.item(rowNum, 0).setCheckState(Qt.Unchecked)








void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)

QStandardItemModel在单元格改变时会自动发出itemChanged信号,设置槽函数OnCheckBoxItemChanged处理该信号就可以进行行的选择。

需要注意的是QStandardItem可以获得行号,tableView有函数可以直接选中指定行,但是没找到不选择中指定行的函数。

于是还得根据QStandardItem找到QModelIndex,再根据QModelIndex不选择某行,不选择某行的时候需要为QItemSelectionModel.Deselect|QItemSelectionModel.Rows,否则只能不选择第一个单元格。









QModelIndex indexFromItem(const QStandardItem *item) const 查询指定QStandardItem的QModelIndex

ModelIndex = self.targetItemModel.indexFromItem(item)
self.targetSelectModel.select(ModelIndex, QItemSelectionModel.Deselect|QItemSelectionModel.Rows)  








void itemChanged(QStandardItem *item)

def initTargetView(self):
print('initTargetView')
self.targetItemModel = QStandardItemModel()
self.tableView.setModel(self.targetItemModel)
#按照行选择,可选择多行
self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
self.tableView.setSelectionMode(QAbstractItemView.MultiSelection)
#初始化QStandardItemModel
self.LoadTarget()
#需要初始化设置QItemSelectionModel
self.targetSelectModel = QItemSelectionModel(self.targetItemModel)
self.tableView.setSelectionModel(self.targetSelectModel)
self.pushButton_add.clicked.connect(self.CreateTarget)
self.pushButton_modify.clicked.connect(self.ModifyTarget)
self.pushButton_del.clicked.connect(self.DeleteTarget)
self.tableView.doubleClicked.connect(self.OnTargetDoubleClicked)
self.targetSelectModel.selectionChanged.connect(self.OnSelectionChanged)
self.targetItemModel.itemChanged.connect(self.OnCheckBoxItemChanged)

def OnSelectionChanged(self,selectlist, deselectlist):
print('OnSelectionChanged')
#选择项改变后,遍历选择的行,将第一列设置为Qt.Checked状态,遍历未选择的行,将未选择的行设置为Qt.Unchecked状态。
for item in selectlist.indexes():
rowNum = item.row()
# 0:Qt.Unchecked, 1:Qt.PartiallyChecked, 2:Qt.Checked
self.targetItemModel.item(rowNum, 0).setCheckState(Qt.Checked)
for item in deselectlist.indexes():
rowNum = item.row()
self.targetItemModel.item(rowNum, 0).setCheckState(Qt.Unchecked)
def OnCheckBoxItemChanged(self, item):
print('OnCheckBoxItemChanged')
#对于itemChanged的单元格,获取行的行号和索引,如果该行的checkState为Checked则选择整行,如果checkState为Unchecked,则整行变为不选择。
rowNum = item.row()

ModelIndex = self.targetItemModel.indexFromItem(item)

if self.targetItemModel.item(rowNum,0).checkState() == Qt.Checked:
self.tableView.selectRow(rowNum)
elif self.targetItemModel.item(rowNum,0).checkState() == Qt.Unchecked:
self.targetSelectModel.select(ModelIndex, QItemSelectionModel.Deselect|QItemSelectionModel.Rows)
def LoadTarget(self):
print('LoadTarget')
#从数据库获取Target信息,类似表格表格数据
self.targetlist = self.returnTargetInfo()
RowNum = len(self.targetlist)
#每次导入时将Model中的数据清除,重新初始化
self.targetItemModel.clear()
#第一列没有名称,为CheckBox
self.targetItemModel.setHorizontalHeaderLabels(('', '名称', '参数1', '参数2', '参数3'))
self.tableView.verticalHeader().hide() #列表头不显示
self.tableView.horizontalHeader().setHighlightSections(False)
self.tableView.setColumnWidth(0,10) #设置各列宽度
self.tableView.setColumnWidth(1,30)
self.tableView.setColumnWidth(2,115)
self.tableView.setColumnWidth(3,85)
self.tableView.setColumnWidth(4,40)
for row in range(RowNum):
#cell为第一列,不能编辑,有勾选框可以勾选
cell = QStandardItem()
cell.setCheckable(True)
cell.setEditable(False)
self.targetItemModel.setItem(row, 0, cell)
for col in range(4):
cell = QStandardItem(str(self.targetlist[row][col + 1]))
cell.setEditable(False)
self.targetItemModel.setItem(row, col+1, cell)
self.tableView.show()

 

推荐阅读
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 深入解析 Android TextView 中 getImeActionLabel() 方法的使用与代码示例 ... [详细]
  • 在Django中提交表单时遇到值错误问题如何解决?
    在Django项目中,当用户提交包含多个选择目标的表单时,可能会遇到值错误问题。本文将探讨如何通过优化表单处理逻辑和验证机制来有效解决这一问题,确保表单数据的准确性和完整性。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 在 Angular Google Maps 中实现图片嵌入信息窗口的功能,可以通过使用 `@agm/core` 库来实现。该库提供了丰富的 API 和组件,使得开发者可以轻松地在地图上的信息窗口中嵌入图片。本文将详细介绍如何配置和使用这些组件,以实现动态加载和显示图片的功能。此外,还将探讨一些常见的问题和解决方案,帮助开发者更好地集成这一功能。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
author-avatar
panda光光_897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有