Cambiar el color de la tabla según el valor de una columna inicial

Estoy tratando de entender cómo se muestran los datos de una base de datos en una tabla Qt. Lo que quiero hacer es cambiar el valor que se muestra en un booleano para leer "PASS" o "FAIL" y luego cambiar el color de la fila según esto.

He creado un QSqlQueryModel clase derivada para el modelo y anuló la función:

QVariant TestResultsViewModel::data(const QModelIndex &index, int role) const
{
    QVariant value = QSqlQueryModel::data(index, role);

    if (value.isValid() && role == Qt::DisplayRole){
        switch(index.column()){
        case 0:
            return value.toBool() ? "PASS" : "FAIL";
        }
    }

    if (role == Qt::TextColorRole){
        // Get column 0
        QVariant pass = index.sibling(index.row(), 0).data();
        if (pass.isValid()){
            if (pass.toBool()){
                return QVariant::fromValue(QColor(Qt::blue));
            }
            else{
                return QVariant::fromValue(QColor(Qt::red));
            }
        }
    }

    return value;
}

Pero lo que parece suceder es que la primera parte se hace primero y luego los valores de la columna son "PASS" o "FAIL" y no 0, 1, por lo que los colores no cambian.

Entonces, ¿cómo debería realmente estar haciendo esto?

preguntado el 12 de junio de 12 a las 14:06

1 Respuestas

La implementación de QModelIndex::data() explica este comportamiento:

inline QVariant QModelIndex::data(int arole) const
{ return m ? m->data(*this, arole) : QVariant(); }

donde m es el modelo del índice del modelo.

Esto significa que su llamada de

index.sibling(index.row(), 0).data(); 

termina llamando TestResultsViewModel::data() nuevamente, lo que significa que de hecho obtienes "PASS" o "FAIL" como resultado.

Para evitar esto, puede hacer lo siguiente:

QModelIndex firstColumnIndex = index.sibling( index.row(), 0 );
QVariant pass = QSqlQueryModel::data( firstColumnIndex );

Esto llamará explícitamente QSqlQueryModel::data() en lugar de TestResultsViewModel::data() y omite tu código

Respondido el 12 de junio de 12 a las 15:06

Cualquier momento. Por cierto, puede omitir el parámetro Qt::DisplayRole, data() lo usará de forma predeterminada. Edité la respuesta en consecuencia. - tim meyer

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.