PyQt5 QTableWidget 禁用后如何重新启用单元格? [复制]
Posted
技术标签:
【中文标题】PyQt5 QTableWidget 禁用后如何重新启用单元格? [复制]【英文标题】:PyQt5 QTableWidget How to re-enable a cell after disabling? [duplicate] 【发布时间】:2020-06-02 19:14:19 【问题描述】:对于我的生活,我无法弄清楚这一点。我有一个表格,在第 0 行第 0 行我有一个复选框。如果未单击该复选框,我想禁用第 1 行第 0 列。否则,如果单击,则启用第 1 行第 0 列。
为了禁用它,我一直在使用标志:
if not self.example_table.cellWidget(0,0).isChecked():
flags = QtCore.Qt.ItemFlags()
flags != QtCore.Qt.ItemIsEnabled
# flags != QtCore.Qt.ItemIsEditable (This also works to disable it)
self.example_table.item(1,0).setFlags(flags)
问题是,当我尝试使用逆进行 else 时,它不会重新启用单元格。这是我尝试过的。
else:
flags = QtCore.Qt.ItemFlags()
flags == QtCore.Qt.ItemIsEnabled #(still doesnt work)
# flags = QtCore.Qt.ItemIsEnabled (didnt work)
# flags == QtCore.Qt.ItemIsEditable (didnt work)
# flags = QtCore.Qt.ItemIsEditable (didnt work)
self.tblActivityInfo.item(1, 0).setFlags(flags)
无论我尝试什么,1,0 处的单元格仍然处于禁用状态。
self.example_table 只是一个 QtWidgets.QTableWidget(self.centralwidget)
【问题讨论】:
【参考方案1】:您所做的没有多大意义:第二行 flags
都只是比较,它们绝对什么都不做。
您应该获取现有项目的当前标志,然后使用二元运算符更新它们。
item = self.example_table.item(1, 0)
flags = item.flags()
if not self.example_table.cellWidget(0,0).isChecked():
# set the ItemIsEnabled flag bit to 0
flags &= ~QtCore.Qt.ItemIsEditable
else:
# set the ItemIsEnabled flag bit to 1
flags |= QtCore.Qt.ItemIsEditable
flags |= QtCore.Qt.ItemIsEnabled
item.setFlags(flags)
我建议您更好地研究比较运算符的作用以及二进制位运算的工作原理。
【讨论】:
因此,无论出于何种原因,这都可以重新启用单元格,但是我无法更改那里的值。我将“ItemIsEnabled”更改为“ItemIsEditable”。但是,这并没有重新启用单元格,所以我在之后添加了 'flags |= QtCore.Qt.ItemIsEnabled'。这行得通,谢谢! 是的,我也不知道为什么要进行比较,但这就是我在许多不同的谷歌搜索中找到的代码片段。我也不明白为什么比较会改变标志的影响,但他们确实做到了。 不,他们没有。它在第一种情况下“起作用”(禁用项目),因为您创建了一个“空”标志(如 0 值),它不启用任何标志(显然包括 ItemIsEnabled)。 这更有意义。我觉得有人曾经用这个回答过这个问题,并且它被多次复制到不同的响应中,导致它“有效”地禁用它。 这很可能,不幸的是,在没有真正理解它的作用的情况下使用代码(尤其是在 SO 上)是很常见的。无论如何,我已经看到了您的编辑建议,但我不明白:ItemIsEnabled
和 ItemIsEditable
是两个截然不同的标志,它们的存在是有特定原因的。您要(禁用|启用)该项目还是使其[不可]可编辑?以上是关于PyQt5 QTableWidget 禁用后如何重新启用单元格? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PYQT5 使 QTableWidget 单元格只读?
如何在 PyQt5 中设置 QTableWidget 的单元格样式?
如何在 PyQt5 中捕获 QTableWidget 上的左右鼠标单击事件?
如何使用 PyQt5 Python 将 QTableWidget 数据转换为 PDF