主要参考以下两篇博文:
Pyqt5的tableWidget的单元格控件居中
在 QTableWidget PyQT 中获取复选框 cellWidget 的状态

首先,我个人需要在一个函数中创建表格,并引入checkBox控件居中对其,然后在另一个函数中读取表格的checkBox控件的勾选状态。参考第一篇文章后代码如下:

            for countlength in range(0, countVD):
                item1 = QTableWidgetItem(Details[countlength].replace(" ", ""))  # 设备名称赋值,并删除所有的空格
                item3 = QTableWidgetItem(SNnum[countlength])  # 设备ID赋值
                
                # 控件居中方法:
                checkBox = QCheckBox()  # 定义checkbox控件
                checkBox.setChecked(True)  # 默认全部勾选
                # 1.实例化一个新布局
                hLayout = QtWidgets.QHBoxLayout()
                # 2.在布局里添加checkBox
                hLayout.addWidget(checkBox)
                # 3.在布局里居中放置checkBox并设置水平居中
                hLayout.setAlignment(checkBox, Qt.AlignHCenter)
                # 4.实例化一个QWidget(控件)
                widget = QtWidgets.QWidget()
                # 5.在QWidget放置布局
                widget.setLayout(hLayout)
                
                # 第一列添加设备名称
                self.ui.tableWidget.setItem(countlength, 0, item1)
                # 第二列加入widget控件,包含了居中命令和checkBox
                self.ui.tableWidget.setCellWidget(countlength, 1, widget)
                # 第三列添加设备ID
                self.ui.tableWidget.setItem(countlength, 2, item3)
                # 自动调整表格高度
                self.ui.tableWidget.resizeRowToContents(countlength)
            # 自动调整表格宽度
            self.ui.tableWidget.resizeColumnToContents(0)
            self.ui.tableWidget.resizeColumnToContents(1)
            self.ui.tableWidget.resizeColumnToContents(2)

运行结果如下,可以看到控件可操作且都对其了。
在这里插入图片描述
但是在另一个函数中读取该表格中的checkBox状态时会出现报错,代码如下:

        for countlength in range(0, countVD):
            checkcount = self.ui.tableWidget.cellWidget(countlength, 1).isChecked()
            check.append(checkcount)

报错信息如下:

在这里插入图片描述
参考第二篇文章,报错原因为:定义checkBox时将其存放在QWidget 中,QWidget 作为一个单元格部件,并不包含isChecked或者checkState属性。解决方案是将checkBox加入到小部件的属性中,定义表格内容的代码修改如下:

            for countlength in range(0, countVD):
                item1 = QTableWidgetItem(Details[countlength].replace(" ", ""))  # 设备名称赋值,并删除所有的空格

                item3 = QTableWidgetItem(SNnum[countlength])  # 设备ID赋值

                # # 控件居中方法:
                # checkBox = QCheckBox()  # 定义checkbox控件
                # checkBox.setChecked(True)  # 默认全部勾选
                # # 1.实例化一个新布局
                # hLayout = QtWidgets.QHBoxLayout()
                # # 2.在布局里添加checkBox
                # hLayout.addWidget(checkBox)
                # # 3.在布局里居中放置checkBox并设置水平居中
                # hLayout.setAlignment(checkBox, Qt.AlignHCenter)
                # # 4.实例化一个QWidget(控件)
                # widget = QtWidgets.QWidget()
                # # 5.在QWidget放置布局
                # widget.setLayout(hLayout)

                widget = QWidget()
                widget.checkbox = QCheckBox() # 将checkbox放在widget中
                widget.checkbox.setCheckState(Qt.Checked) # 默认全部勾选
                playout = QHBoxLayout(widget)
                playout.addWidget(widget.checkbox) # 为小部件添加checkbox属性
                playout.setAlignment(Qt.AlignCenter) # 设置小控件水平居中
                widget.setLayout(playout) # 在QWidget放置布局

                # 第一列添加设备名称
                self.ui.tableWidget.setItem(countlength, 0, item1)
                # 第二列加入widget控件,包含了居中命令和checkBox
                self.ui.tableWidget.setCellWidget(countlength, 1, widget)
                # 第三列添加设备编号
                self.ui.tableWidget.setItem(countlength, 2, item3)
                # 自动调整表格高度
                self.ui.tableWidget.resizeRowToContents(countlength)
            # 自动调整表格宽度
            self.ui.tableWidget.resizeColumnToContents(0)
            self.ui.tableWidget.resizeColumnToContents(1)
            self.ui.tableWidget.resizeColumnToContents(2)
            # self.setLayout(layout)

表格读取部分修改如下(其实就是在中间加了个checkbox):

 for countlength in range(0, countVD):
            checkcount = self.ui.tableWidget.cellWidget(countlength, 1).checkbox.isChecked()
            check.append(checkcount)

我们来测试下:
在这里插入图片描述
运行后可以看到checkbox都居中对其了,很好,然后我们把第四和第五行取消勾选,继续运行看下结果:
在这里插入图片描述
可以看到第四个和第五个值是False其余的是True,问题解决。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐