【问题标题】:PyQt Tableview background color based on text value rather than True or False基于文本值而不是 True 或 False 的 PyQt Tableview 背景颜色
【发布时间】:2017-10-22 14:26:25
【问题描述】:

关注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)

然后所有的行都变黄了。

什么给了?有人能帮我理解吗?

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

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

【问题讨论】:

  • 你要绘制哪一列的数据?
  • 继续你写的例子,假设我想测试lastname == "Young"

标签: python qt pyqt pyqt4 pyqt5


【解决方案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)

【讨论】:

  • 嗨@eyllanesc,我知道这是一个古老的主题,但只是一个简单的问题。我看到你正在创建一个自定义类,这是一个要求吗?那就是每次我们使用角色时,我们需要子类化还是我们可以在内部或当前类中创建一个方法?希望我的问题有意义......
  • @Heliomaster 我不懂你,你自己解释清楚。
  • 嗨@eyllanesc,谢谢你回来找我。我的问题是假设我的主类是这样的:class MainWindow(QMainWindow, Lmt.Ui_MainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setupUi(self) self.LmtDb = LmtDataBase() 等等...我可以在这个类中添加数据方法,还是我必须创建一个自定义类并在这个类中使用角色。希望这更有意义......
  • @Heliomaster 好的,我明白你的意思,我在上下文中给出了解决方案,但我发现它不适合你的情况,当你有时间时,我会向你展示另一个更简单的选择在代表的帮助下适应您的情况。
  • 谢谢@eyllanesc。非常愿意看看你是怎么做的。附带说明一下,您的帖子总体上做得很好,我在其他主题上使用了您的一些示例,它们总是清晰,简洁且有据可查。这就是堆栈溢出的全部意义......
猜你喜欢
  • 2018-12-22
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2018-04-27
  • 2014-01-07
  • 2017-03-25
相关资源
最近更新 更多