如何迭代 QTableWidget 中的列并检查是否选中了复选框?
How to iterate a column in QTableWidget and check if a check box is checked?
如何遍历 QTableWidget
中的一列并检查复选框是否被选中?
当我点击左边的按钮时,我想迭代图片中的列,并检查是否选中了复选框。
截至目前,我已经尝试过此功能,但仅此功能 return 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 可以有 empty 个单元格,这些单元格是尚未设置 QTableWidgetItem 且用户未插入数据(即使其索引存在)的项目,即为什么我必须检查该项目是否不是 None;
- 不要将
item(row, col)
与 itemAt(x, y)
混淆,后者基于视图上的像素坐标;
- 如果一个项目没有
checkState
明确设置,它的值也是None
。
- 不要使用布尔值来设置和验证状态,因为 Qt check states 是 三态 :
Unchecked
(0), PartiallyChecked
(1) 和 Checked
(2);默认情况下,它们的鼠标行为 是 布尔值,但是在执行任何“基本”操作之前,您必须考虑这一点,就像您对基本 bool
所做的那样(不过,对于 QCheckBox,至于任何按钮,您可以使用 isChecked()
和 setChecked()
,它们是普通的基于布尔的函数);这意味着如果您尝试执行 setCheckState(True)
,结果将是 partially checked 项目,因为对于 python True
与 1
相同(因此,在 Qt 术语中,PartiallyChecked
):如果要设置 fully 选中状态,您 应该做setCheckState(Qt.Checked)
;
如何遍历 QTableWidget
中的一列并检查复选框是否被选中?
当我点击左边的按钮时,我想迭代图片中的列,并检查是否选中了复选框。
截至目前,我已经尝试过此功能,但仅此功能 return 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 可以有 empty 个单元格,这些单元格是尚未设置 QTableWidgetItem 且用户未插入数据(即使其索引存在)的项目,即为什么我必须检查该项目是否不是 None;
- 不要将
item(row, col)
与itemAt(x, y)
混淆,后者基于视图上的像素坐标; - 如果一个项目没有
checkState
明确设置,它的值也是None
。 - 不要使用布尔值来设置和验证状态,因为 Qt check states 是 三态 :
Unchecked
(0),PartiallyChecked
(1) 和Checked
(2);默认情况下,它们的鼠标行为 是 布尔值,但是在执行任何“基本”操作之前,您必须考虑这一点,就像您对基本bool
所做的那样(不过,对于 QCheckBox,至于任何按钮,您可以使用isChecked()
和setChecked()
,它们是普通的基于布尔的函数);这意味着如果您尝试执行setCheckState(True)
,结果将是 partially checked 项目,因为对于 pythonTrue
与1
相同(因此,在 Qt 术语中,PartiallyChecked
):如果要设置 fully 选中状态,您 应该做setCheckState(Qt.Checked)
;