如何从QTableWidget中读取内嵌QCheckBox的选中状态
你往单元格里塞的是包裹了QCheckBox的QWidget容器,所以cellWidget()返回的就是你当初塞的这个外层容器,不是直接返回QCheckBox,你需要从这个容器里提取内部的QCheckBox实例即可。
解决方法
方法1:直接从布局提取子控件
你创建容器时是往QHBoxLayout里加的QCheckBox作为第一个控件,直接从布局取即可,代码示例:
# 获取单元格对应的容器控件 cell_widget = self.definedEventsTable.cellWidget(row, select_column) if cell_widget: # 从容器的布局中取出第一个子控件,就是你创建的QCheckBox check_box = cell_widget.layout().itemAt(0).widget() # 读取选中状态 is_selected = check_box.isChecked()
方法2:通过objectName定位(更稳妥,不易受布局调整影响)
创建QCheckBox的时候给它设置唯一标识,后续直接查找即可:
- 修改创建复选框的代码,增加objectName设置:
chk_bx = QCheckBox() chk_bx.setObjectName("table_cell_checkbox") # 新增这行 - 读取状态的时候直接查找对应控件:
cell_widget = self.definedEventsTable.cellWidget(row, select_column) if cell_widget: check_box = cell_widget.findChild(QCheckBox, "table_cell_checkbox") is_selected = check_box.isChecked()
之前接口返回None的原因说明
item(row, select_column):该接口返回的是单元格对应的QTableWidgetItem实例,你没有手动给该单元格设置过Item,因此返回NoneitemAt(row, select_column):该接口的入参是像素坐标值,不是行号、列号,传行列号自然返回错误结果- 如果之前
cellWidget()返回过None,优先排查行号、列号是否从0开始计数,是否超出了表格当前的总行数/总列数范围。
内容的提问来源于stack exchange,提问作者geekygeek
相关产品推荐
相关产品推荐

