主要参考以下两篇博文:
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,问题解决。