我有一个QTreeWidget,其中包含两列和一些行。我想设置一个标志,以便如果第二列中的项目为零或空,则无法进行编辑。如果单击的项目不是数字,则会以红色文本显示。
我的代码:
def qtree_check_item(self, item, column):
item.setFlags(QtCore.Qt.ItemIsEnabled)
if column == 1:
if item.text(1) != '0':
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
if not item.text(1).isnumeric():
item.setForeground(1, QtGui.QBrush(QtGui.QColor("red")))
如果项目为零,则此方法有效。如果我更换:
if item.text(1) != '0':
带
if item.text(1) != '':
这适用于空字符串。但如果我将两者结合使用:
if item.text(1) != '0' or item.text(1) != '':
未设置标志。我做错了什么?
答案 0 :(得分:1)
我想设置一个标志,以便第二列中的项目是 无论是零还是空,都无法编辑。
然后你......
if item.text(1) != '0' or item.text(1) != '':
item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
现在考虑item.text(1) == '0'
会发生什么。在这种情况下,第二个测试item.text(1) != ''
通过,整个条件由于or
而通过。同样,如果item.text(1) == ''
为真,则测试item.text(1) != '0'
将通过,结果是整个条件传递。
所以,你只想设置editable
标志,如果两者......
item.text(1) != '0' and item.text(1) != ''
坚持。
换句话说,因为item.text(1)
不能同时同时包含'0'
和''
......
if item.text(1) != '0' or item.text(1) != '':
本质上是......
if True or False:
总是会过去。
(对不起,如果这一切看起来有点令人费解。)