如何在PyQt6的QTableWidget中为复选框创建触发信号?
问题修复方案
你的代码存在几个关键错误,导致复选框的信号连接失效,以下是修正方案:
错误点分析与修正
复选框实例化错误
你将w_checkbox赋值为QtWidgets.QCheckBox类本身,而非创建实例。后续每次调用w_checkbox()都会生成新的复选框,导致绑定信号的对象和表格中显示的不是同一个。信号连接语法错误
connect方法需要传入函数引用,你写的self.clicked_button()是直接执行函数,而非绑定信号触发逻辑。重复设置CellWidget
先后两次调用setCellWidget,第二次会覆盖第一次的设置,且第一次创建的复选框未被加入布局。
修正后的完整代码
while self.query.next(): # 创建复选框容器 checkbox_widget = QWidget() checkbox_widget.setStyleSheet('background-color: transparent;') # 正确创建复选框实例 w_checkbox = QtWidgets.QCheckBox() # 布局设置 layout_cb = QtWidgets.QHBoxLayout(checkbox_widget) layout_cb.addWidget(w_checkbox) layout_cb.setAlignment(Qt.AlignmentFlag.AlignCenter) layout_cb.setContentsMargins(0, 0, 0, 0) checkbox_widget.setLayout(layout_cb) tablerow = self.table_EP.rowCount() self.table_EP.insertRow(tablerow) # 填充表格数据(保留原有逻辑) self.table_EP.setItem(tablerow, 0, QtWidgets.QTableWidgetItem(self.query.value('col1'))) self.table_EP.setItem(tablerow, 1, QtWidgets.QTableWidgetItem(self.query.value('col2'))) self.table_EP.setItem(tablerow, 2, QtWidgets.QTableWidgetItem(self.query.value('col3'))) self.table_EP.setItem(tablerow, 3, QtWidgets.QTableWidgetItem(str(self.query.value('col4')))) self.table_EP.setItem(tablerow, 4, QtWidgets.QTableWidgetItem(str(self.query.value('col5')))) self.table_EP.setItem(tablerow, 5, QtWidgets.QTableWidgetItem(str(self.query.value('col6')))) self.table_EP.setItem(tablerow, 6, QtWidgets.QTableWidgetItem(self.query.value('col7'))) self.table_EP.setItem(tablerow, 7, QtWidgets.QTableWidgetItem(str(self.query.value('col8')))) self.table_EP.setItem(tablerow, 8, QtWidgets.QTableWidgetItem(str(self.query.value('col9')))) # 仅设置一次CellWidget self.table_EP.setCellWidget(tablerow, 9, checkbox_widget) # 正确连接信号:传入函数引用,不要加括号 w_checkbox.stateChanged.connect(self.clicked_button)
配套函数定义
确保你的clicked_button函数适配stateChanged信号的参数要求:
def clicked_button(self, state): # state参数会传入复选框状态:Qt.CheckState.Checked / Unchecked / PartiallyChecked print(f"复选框状态:{state}") # 此处编写你的业务逻辑
内容的提问来源于stack exchange,提问作者jbone73
相关产品推荐
相关产品推荐

