当时写这个地方的时候需要在一定条件下把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对单元格的初始化真的离谱。