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

Python PyQt Tableview背景色基于文本值,而不是True或False,python,qt,pyqt,pyqt4,pyqt5,Python,Qt,Pyqt,Pyqt4,Pyqt5,接下来,where很友好地回答了我的问题 出于好奇,我尝试更改代码以检查字符串而不是1,所有行都变为灰色 原始代码来自: 如果我把它改成 def data(self, item, role): if role == Qt.BackgroundRole: if QSqlQueryModel.data(self, self.index(item.row(), 2), Qt.DisplayRole): return QBrush(Qt.yellow)

接下来,where很友好地回答了我的问题

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

原始代码来自:

如果我把它改成

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)
然后所有的行都变成黄色

有什么好处?有人能帮我理解吗

注意,我知道一个非空的python字符串将等价于True


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

如果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)

要绘制的数据是哪列?继续您编写的示例,假设我想测试
lastname==“Young”
Hi@eyllansc,我知道这是一个旧主题,但只是一个简单的问题。我看到您正在创建一个自定义类,这是一个要求吗?那就是每次我们使用角色时,我们是否需要子类化,或者我们是否可以在内部或当前类中创建一个方法?希望我的问题有意义…@Heliomaster我不理解你,请更好地解释自己。嗨@eyllanesc,谢谢你回来找我。我的问题是,假设我的主类是这样的:
classmainwindow(QMainWindow,Lmt.Ui\u MainWindow):def\uuuu init\uu(self,parent=None):super(MainWindow,self)。\uuuu init\uuu(parent)self.setupUi(self)self.LmtDb=LmtDataBase()
等。。。我可以在这个类中添加数据方法吗?或者我必须创建一个自定义类,并在这个类中使用角色。希望这更有意义…@Heliomaster好的,我理解你指出的,我在上下文中给出了解决方案,但我发现它不适合你的情况,当你有时间时,我会在代表的帮助下向你展示另一个更简单、更适合你的情况的选项。谢谢@eyllanesc。非常愿意看看你是怎么做的。顺便说一句,你的文章总体上做得很好,我在其他主题上使用了一些你的例子,它们总是清晰、简洁且有很好的文档记录。这就是堆栈溢出的全部内容。。。。
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)