【问题标题】:PyQt Tableview row background colour based on cell value基于单元格值的 PyQt Tableview 行背景颜色
【发布时间】:2017-10-21 10:03:57
【问题描述】:

我正在使用 Python3+ 和 Qt5(虽然很高兴有 Py2.7 和 Qt4 的答案!)。 被关于样式、委托、模型和其他所有内容的大量文档完全搞糊涂了。

我发现设置交替行的背景很简单,但我想为一列匹配特定值(即Archive == True)的行设置背景。

交替行:

self.plainModel = QSqlQueryModel()
self.create_model()
self.linksTable.setModel(self.plainModel)
self.linksTable.setAlternatingRowColors(True)
self.linksTable.setStyleSheet("alternate-background-color: Lightgrey;background-color: white;")
self.linksTable.resizeColumnsToContents()

我已经看到了一个示例,展示了如何做到这一点through the model,但这个具体的示例似乎只是复制了备用行的结果,并且在盯着代码几天后,我无法弄清楚如何将其转换为检查存档列。

example中提取:

elif role == Qt.BackgroundRole:
    if index.row() % 2 == 0:
        return QBrush(Qt.yellow)
elif role != Qt.DisplayRole:
    return QVariant()

我找到了另一个example using delegates,但目前无法理解。

尤其是我仍然无法理解您将如何选择哪些行获得更改,并且无法理解如何将简单的背景颜色应用为“选项”! (阅读 QStyleOptionViewItem 上的文档让我陷入了困境!)。

你能帮忙吗?

【问题讨论】:

    标签: python qt pyqt pyqt4 pyqt5


    【解决方案1】:

    我们必须获取存档列中的数据(在我的示例中是第三个)并验证它是否满足条件(在本例中为 true),如果满足,我们返回具有所需颜色的 QBrush 对象。

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

    在我的例子中,使用数据库 SQLITE,其中没有布尔数据,但使用限制为值 0 或 1 的数据类型 int 进行模拟,因此请使用以下指令,分别根据 1 或 0 返回 True 或 False。

    def data(self, item, role):
        [...]
        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)
    

    总之使用下面的代码,另外完整的代码是here:

    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)
    

    截图:

    【讨论】:

    • 完美 - 如果您有兴趣,我已经添加了一个后续问题。我没有将它作为讨论包含在内,因为您已经完全回答了这个问题。 stackoverflow.com/questions/44121172/…
    • 我想看看存储库中的代码,它还在附近吗?,看起来存储库已更改
    猜你喜欢
    • 2018-12-22
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2016-07-25
    • 2017-06-19
    • 2013-03-15
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多