class UserModel(QSqlQueryModel):def __init__(self):super().__init__()self._query = "SELECT name, age FROM users"self.refresh()def refresh(self):self.setQuery(self._query)# 重新定义data()方法def data(self, index, role): if role == Qt.BackgroundRole : # 如果角色是背景色if index.row() % 2 == 0: # 偶数行return QColor("#a0a0a0")else:return QColor("#f0f0f0")return super().data(index, role) # 其余角色继承父类的data()方法
这段代码重新定义模型的data()方法,接收参数 index 和 role。如果 role 的值等于 Qt.BackgroundRole,表示设置背景色。如果 index 的行索引值除以 2 的余数为 0,即偶数行,返回颜色对象 QColor ("#a0a0a0"),否则返回 QColor ("#f0f0f0")。如果 role 不是 Qt.BackgroundRole,就调用父类的 data 方法并返回结果。
利用这个方法,可以实现一些其他的特制显示,比如,在上面的基础上增加一个功能:判断一个单元格的数字是否大于某一个设定值,如果大于设定值就显示为红色:
class UserModel(QSqlQueryModel):def __init__(self):super().__init__()self._query = "SELECT name, age FROM users"self.refresh()def refresh(self):self.setQuery(self._query)def data(self, index, role):if role == Qt.BackgroundRole : # 检查是否是背景颜色角色if index.row() % 2 == 0:return QColor("#a0a0a0")else:return QColor("#f0f0f0")elif role == Qt.ForegroundRole: # 检查是否是文字颜色角色if index.column() == 1: # 检查是否是 age 列value = self.record(index.row()).value(index.column()) # 获取单元格的值try:# 尝试将值转换为浮点数进行比较if float(value) > 10:return QColor(Qt.red) # 如果大于设定值,返回红色except (ValueError, TypeError):# 如果值不能转换为浮点数,忽略颜色设置passreturn super().data(index, role)