首页 > 解决方案 > 如何迭代 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()

我希望你能帮我解决这个问题

标签: pythonpyqtpyqt5qtablewidget

解决方案


“单元格小部件”是添加到视图索引的 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()and setChecked(),它们是基于普通布尔值的功能); 这意味着如果你尝试做setCheckState(True),结果将是一个部分检查的项目,因为对于 pythonTrue是相同的1(所以,在 Qt 术语中,PartiallyChecked):如果你想设置一个完全检查的状态,你应该setCheckState(Qt.Checked)

推荐阅读