使用QSqlQueryModel创建交替背景色的表格模型
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):
# 如果值不能转换为浮点数,忽略颜色设置
pass
return super().data(index, role)