QTableWidget中table.setItem()调用不当致无修改触发验证错误
问题原因与解决方法
问题原因
点击「Select」按钮时,cal_Select方法会调用table.setItem()重新设置单元格内容,这一操作会触发itemChanged信号,进而执行cellChange函数。而你的alldata数组里的内容(比如name1、value10)都是小写开头,符合val.islower() == True的判断条件,所以会触发错误提示。
解决方法
这里提供三种可行方案,按需选择:
方案一:临时断开信号再重连
在cal_Select里先断开信号连接,更新完单元格后再重新连接,避免程序自动更新时触发校验:
def cal_Select(self): # 临时断开itemChanged信号与cellChange的绑定 self.table.itemChanged.disconnect(self.cellChange) i = 3 while i >= 0: zz = 0 while zz <= 1: item = self.alldata[i][zz] cell = QTableWidgetItem(item) self.table.setItem(i, zz, cell) zz += 1 i -= 1 # 更新完成后重新绑定信号 self.table.itemChanged.connect(self.cellChange)
方案二:标记程序自动更新的内容
给程序自动设置的单元格加自定义标记,在cellChange里判断是否跳过校验:
- 在创建单元格的地方添加标记(包括
calendar和cal_Select方法里):
cell = QTableWidgetItem(item) cell.setData(QtCore.Qt.UserRole, True) # 标记为程序自动设置的内容 self.table.setItem(i, zz, cell)
- 修改
cellChange函数:
def cellChange(self, item): # 检查是否是程序自动设置的内容,是则跳过校验并清除标记 if item.data(QtCore.Qt.UserRole): item.setData(QtCore.Qt.UserRole, None) return row = item.row() col = item.column() print(str(row) + '---' + str(col)) val = item.text() if val == ' ': print("Cell cant contain a space") return if val.islower(): print("Value must be CAPITAL") return
方案三:只校验特定列(按需使用)
如果cal_Select只更新前两列,且这两列不需要用户校验,可以在cellChange里判断列索引跳过:
def cellChange(self, item): col = item.column() # 前两列是程序更新的,跳过校验 if col < 2: return row = item.row() print(str(row) + '---' + str(col)) val = item.text() if val == ' ': print("Cell cant contain a space") return if val.islower(): print("Value must be CAPITAL") return
内容的提问来源于stack exchange,提问作者user17565490
相关产品推荐
相关产品推荐

