Color de fondo de fila de PyQt Tableview basado en valor de celda

Python (3+) y Qt (5) (¡aunque estoy feliz de tener respuestas Py2.7 y Qt4!). Totalmente confundido por la vasta documentación sobre estilos, delegates, modelos y todo lo demás.

Me ha resultado sencillo configurar el fondo de las filas alternativas, pero quiero establecer el fondo para las filas donde una columna coincida con un valor específico (es decir, Archive == True ).

Filas alternativas:

 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() 

He visto un ejemplo que muestra cómo hacerlo a través del modelo, pero este ejemplo específico parece estar simplemente replicando el resultado de las filas alternativas, y después de unos días iniciando un código, no puedo encontrar la manera de traducirlo a la verificación del archivo. columna.

Extracto del ejemplo :

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

He encontrado otro ejemplo utilizando delegates, pero en este momento no puedo entenderlo.

¡Especialmente todavía no puedo entender cómo elegiría qué filas recibirían el cambio, y no puedo entender cómo aplicar simplemente un color de fondo como “opción”! (¡Leer la documentación en QStyleOptionViewItem me está enviando por el agujero de conejo!).

¿Puede usted ayudar?

Debemos obtener los datos en la columna de archivo (en mi ejemplo es la tercera) y verificar que cumple con la condición (en este caso, verdadera), si es así, devolvemos el objeto QBrush con el color deseado.

 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) 

También en mi caso use la base de datos SQLITE donde no hay datos booleanos, pero emule con el tipo de datos int restringido a los valores 0 o 1, así que use la siguiente instrucción donde devuelve True o False según 1 o 0, respectivamente.

 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) 

En breve use el siguiente código, además el código completo está aquí :

 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) 

Captura de pantalla:

introduzca la descripción de la imagen aquí