python - 如何迭代 QTableWidget 中的列并检查是否选中了复选框?
问题描述
如何迭代一列QTableWidget
并检查是否选中了复选框?
当我单击左侧的按钮时,我想迭代图片中的列并检查是否选中了复选框。
截至目前,我已经尝试过这个函数,但这个函数只返回None
:
def checkBoxcheck(self):
print("checkBoxcheck started")
for row in range(self.rowCount()):
print(self.cellWidget(1, 1))
if not self.cellWidget(1, 1) is None:
if self.cellWidget(row, 1).isChecked():
#others to do
这是用于重现此问题的代码(我已经删除了代码中那些不必要的部分):
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTableWidget, \
QTableWidgetItem, QVBoxLayout, QHBoxLayout
from PyQt5.QtCore import Qt
from PyQt5 import QtCore, QtWidgets
import sys
class TableWidget(QTableWidget):
def __init__(self):
super().__init__(10, 3)
self.verticalHeader().setDefaultSectionSize(10)
self.horizontalHeader().setDefaultSectionSize(200)
for rows in range(self.rowCount()):
item = QtWidgets.QTableWidgetItem()
item.setCheckState(QtCore.Qt.Unchecked)
self.setItem(rows, 1, item)
def checkBoxcheck(self):
print("checkBoxcheck started")
for row in range(self.rowCount()):
print(self.cellWidget(1, 1))
if not self.cellWidget(1, 1) is None:
if self.cellWidget(row, 1).isChecked():
#others to do
pass
class AppDemo(QWidget):
def __init__(self):
super().__init__()
self.resize(700, 500)
mainLayout = QHBoxLayout()
table = TableWidget()
mainLayout.addWidget(table)
buttonLayout = QVBoxLayout()
button_new = QPushButton('Check if checked')
button_new.clicked.connect(table.checkBoxcheck)
buttonLayout.addWidget(button_new)
mainLayout.addLayout(buttonLayout)
self.setLayout(mainLayout)
def app():
app = QApplication(sys.argv)
demo = AppDemo()
demo.show()
sys.exit(app.exec_())
app()
我希望你能帮我解决这个问题
解决方案
“单元格小部件”是添加到视图索引的 QWidget,就像它setIndexWidget()
用于任何 QAbstractItemView 一样。它可以是任何小部件、复选框、组合、自定义小部件,甚至是另一个项目视图。
如果要求有可检查的项目,则没有必要这样做,因为 Qt 模型已经提供了该功能,您在执行item.setCheckState()
.
因此,解决方案要简单得多:查找item()
,然后验证状态:
for row in range(self.rowCount()):
item = self.item(row, 1)
if item is not None and item.checkState():
# ...
请记住:
- QTableWidget 可以有空单元格,这些单元格还没有设置 QTableWidgetItem 并且用户没有插入数据(即使它们的索引存在),这就是为什么我必须检查该项目是否不是 None;
- 不要与 混淆
item(row, col)
,itemAt(x, y)
它基于视图上的像素坐标; - 如果一个项目没有
checkState
明确设置,它的值也是None
. - 不要使用布尔值来设置和验证状态,因为Qt 检查状态是三态的:
Unchecked
(0)、PartiallyChecked
(1) 和Checked
(2);默认情况下,它们的鼠标行为是布尔值,但是在执行任何“基本”操作之前,您必须考虑这一点,就像使用基本操作一样bool
(对于 QCheckBox,对于任何按钮,您都可以使用isChecked()
andsetChecked()
,它们是基于普通布尔值的功能); 这意味着如果你尝试做setCheckState(True)
,结果将是一个部分检查的项目,因为对于 pythonTrue
是相同的1
(所以,在 Qt 术语中,PartiallyChecked
):如果你想设置一个完全检查的状态,你应该做setCheckState(Qt.Checked)
;
推荐阅读
- javascript - 创建具有自动调整宽度和恒定高度的文本区域
- selenium - 如何为以下情况编写 xpath 硒
- testing - Runner.run 参数不可用
- apache-spark - How to get Great_Expectations to work with Spark Dataframes in Apache Spark ValueError: Unrecognized spark type: string
- terraform - 我正在尝试使用 terraform 在 gcloud 中创建公共子网和私有子网,但是在创建时出现错误,例如
- parquet - 我可以根据文件大小和架构结构找到镶木地板文件中的数据点数吗
- python - Python替换txt文件中特定行的内容
- javascript - 有没有办法确定照片是从相机还是从 MicrosoftBot 框架中的附件拍摄的
- python-3.x - Pandas groupby 并将第一组的最后一个分配给第二组的第一个
- php - 以php形式使用php函数