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

时间:2017-05-22 19:59:44

标签: python qt pyqt pyqt4 pyqt5

跟进my general question,其中@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)来隐藏测试列来复制所需的行为。

1 个答案:

答案 0 :(得分:1)

您应该检查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)

enter image description here