Python(3+)和Qt(5)(虽然很高兴有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的文档正在发送我的兔子洞!)。
你能帮忙吗?
答案 0 :(得分:2)
我们必须获取归档列中的数据(在我的示例中它是第三个)并验证它是否满足条件(在本例中为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)
截图: