如何迭代 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 True1 相同(因此,在 Qt 术语中,PartiallyChecked):如果要设置 fully 选中状态,您 应该setCheckState(Qt.Checked);