PyQt Tableview 背景颜色基于文本值而不是 True 或 False

PyQt Tableview background color based on text value rather than True or False

跟进 , where @eyllanesc 已经很好地回答了我的问题。

出于好奇,我尝试更改代码以检查字符串而不是 1,结果所有行都变成灰色。

来自 @eyllanesc 的原始代码:

def data(self, item, role):
    if role == Qt.BackgroundRole:
        if QSqlQueryModel.data(self, self.index(item.row(), 3), Qt.DisplayRole):
            return QBrush(Qt.yellow)
    if role == Qt.DisplayRole:
        if item.column() == 3:
            return True if QSqlQueryModel.data(self, item, Qt.DisplayRole) == 1 else False
    return QSqlQueryModel.data(self, item, role)

如果我把它改成

def data(self, item, role):
    if role == Qt.BackgroundRole:
        if QSqlQueryModel.data(self, self.index(item.row(), 2), Qt.DisplayRole):
            return QBrush(Qt.yellow)
    if role == Qt.DisplayRole:
        if item.column() == 2:
            return True if QSqlQueryModel.data(self, item, Qt.DisplayRole) == 'Young' else False
    return QSqlQueryModel.data(self, item, role)

然后所有行都变成黄色。

什么给?谁能帮我理解一下?

N.B。我知道非空 python 字符串将等同于 True

N.B。我可以通过向 SQL 查询添加另一列(使用 CASE WHEN 等)然后使用 setColumnHidden(col, True) 隐藏测试列来复制所需的行为。

你应该检查里面的条件 if role == Qt.BackgroundRole

def data(self, item, role):
    if role == Qt.BackgroundRole:
        if QSqlQueryModel.data(self, self.index(item.row(), 2), Qt.DisplayRole) == "Young":
            return QBrush(Qt.yellow)
    if role == Qt.DisplayRole:
        if item.column() == 3:
            return True if QSqlQueryModel.data(self, item, Qt.DisplayRole) == 1 else False
    return QSqlQueryModel.data(self, item, role)