定时器和复选框冲突?

在系统中添加了定时器,在给复选框添加完变量后,发现复选框无法正常使用,在页面上改变复选框的值,它总是恢复找默认值,在网上搜索了一下,发现也没有类似的答案。于是就仔细分析自己的代码,感觉一定是自己的代码有问题。经过分析后,觉得是updatedata使用上出了问题。由于好久不用VC。对于updatedata()这个函数还是有点陌生。在定时器中自己首先调用updatedate(false)。本意是想让控件值传给变量,好在定时器里处理。结果updatedate(false)的意思是把变量值显示到控件上。于是乎,无论怎么修改复选框内容,它都会恢复默认值了。原来是updatedata用错了。哎,不搞清楚就乱用,害死人啊。
逐行解释 import sys from PyQt6 import QtWidgets, QtCore class MyTableWindow(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle("QTableWidget 表头插入复选框") self.resize(500, 300) # 创建表格 self.table = QtWidgets.QTableWidget(5, 3, self) self.table.setHorizontalHeaderLabels(['列0', '列1', '列2']) # 填充表格内容(第1列使用复选框) for row in range(self.table.rowCount()): cb = QtWidgets.QCheckBox() cb.setCheckState(QtCore.Qt.CheckState.Checked) cb.stateChanged.connect(lambda state, r=row: self.on_row_checkbox_changed(r, state)) self.table.setCellWidget(row, 1, cb) # 创建表头复选框控件 self.header_checkbox = QtWidgets.QCheckBox("全选") self.header_checkbox.setCheckState(QtCore.Qt.CheckState.Checked) self.header_checkbox.stateChanged.connect(self.on_header_checkbox_changed) self.header_widget = QtWidgets.QWidget() layout = QtWidgets.QHBoxLayout(self.header_widget) layout.setContentsMargins(3, 0, 3, 0) layout.addWidget(self.header_checkbox) layout.addStretch() # 设置空 QTableWidgetItem,避免表头文字冲突 self.table.setHorizontalHeaderItem(1, QtWidgets.QTableWidgetItem()) self.table.setCellWidget(0, 1, self.header_widget) # 布局 main_layout = QtWidgets.QVBoxLayout(self) main_layout.addWidget(self.table) self.setLayout(main_layout) def on_header_checkbox_changed(self, state): """当表头复选框状态变化时,同步更新所有行的复选框""" for row in range(self.table.rowCount()): widget = self.table.cellWidget(row, 1) if isinstance(widget, QtWidgets.QCheckBox): widget.blockSignals(True) # 阻止触发事件 widget.setCheckState(QtCore.Qt.CheckState(state)) widget.blockSignals(False) def on_row_checkbox_changed(self, row, state): """当某一行的复选框变化时,同步更新表头复选框状态""" all_checked = True any_unchecked = False for r in range(self.table.rowCount()): widget = self.table.cellWidget(r, 1) if isinstance(widget, QtWidgets.QCheckBox): if widget.checkState() == QtCore.Qt.CheckState.Checked: any_unchecked = False break elif widget.checkState() == QtCore.Qt.CheckState.Unchecked: all_checked = False any_unchecked = True if all_checked: self.header_checkbox.blockSignals(True) self.header_checkbox.setCheckState(QtCore.Qt.CheckState.Checked) self.header_checkbox.blockSignals(False) elif any_unchecked: self.header_checkbox.blockSignals(True) self.header_checkbox.setCheckState(QtCore.Qt.CheckState.Unchecked) self.header_checkbox.blockSignals(False) else: self.header_checkbox.blockSignals(True) self.header_checkbox.setCheckState(QtCore.Qt.CheckState.PartiallyChecked) self.header_checkbox.blockSignals(False) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = MyTableWindow() window.show() sys.exit(app.exec())
08-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值