PyQT5 QtWidgets 设置单元格不可编辑/可编辑 恢复单元格默认设置

当时写这个地方的时候需要在一定条件下把QtWidgets表格的一部分单元格设为不可编辑,在一定条件下又把它们设为可编辑,给我恶心坏了,PyQT的QtWidgets真是反人类的设计。
需要先定义一个有某种特征的QTableWidgetItem,然后将其放到需要修改特征的QtWidgets的单元格上去,要设定QTableWidgetItem的特征还必须修改ItemIsEnabled项。

已经忘了当时是怎么写出来的了,查了文档也查了许多博客,回顾记录一下。

假设已经定义好了ui.tableWidget和i,j,若需要设置单元格(i, j)为不可编辑,则应为:

from PyQt5 import QtWidgets, QtCore

item1 = QtWidgets.QTableWidgetItem()
item1.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
ui.tableWidget.setItem(i, j, item1)

更神奇的来了,恢复单元格(i,j)的默认设置,或者用于设置单元格(i, j)可编辑,应为:

from PyQt5 import QtWidgets, QtCore

item2 = QtWidgets.QTableWidgetItem()
item2.setFlags(QtCore.Qt.ItemFlag(63))
ui.tableWidget.setItem(i, j, item2)

这里写的这么些Flag我试了个遍基本上,才算是找出来怎样设为不可编辑。

为什么非得这样不可呢

为什么非得这样不可呢,我们看一下文档就知道,QTableWidget类里其实是有item()函数的,返回值正是QTableWidgetItem类,而QTableWidgetItem类里是能够setFlags()的,setFlags()函数我们上面也用到了。
按理说这么一路调用下来就足以设置单元格的各种性质了,然而文档对item()函数的描述为:

Returns the item for the given row and column if one has been set; otherwise returns nullptr.

也就是说QTableWidget里面的单元格默认是没有set过的,我们无法对一个没有set过的单元格调用item()函数。

离谱就离谱在这里了。

所以我们只能凭空创造一个QTableWidgetItem出来,设置好各种性质,然后填充到QTableWidget的特定位置里面去。

还有一个相似问题是,QtWidgets如果我需要检查(i, j)位置上有没有被录入字符,需要这样判断:

if ui.tableWidget.item(i, j) and ui.tableWidget.item(i, j).text()!='':
	...

而不能直接判断 if ui.tableWidget.item(i, j).text()!=’’
这个问题同样的原因也能解释,没set过的单元格连text()函数都不能调用,否则会报错,而tableWidget.item()需要用来判断单元格是否set过了!!!

总结起来就是QtWidgets对单元格的初始化真的离谱。

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值