Cita:
Iniciado por dehm 1.- ¿Usar delegados es la mejor forma (mas correcta) de formatear un número para que aparezca el punto como separador de miles y la coma como separador de decimales?
Los delegados lo que te permiten es utilizar widgets diferentes al usado por defecto para visualizar (QLabel) / editar(QLineEdit) los datos de la vista.
Si simplemente necesitas que, en visualización, un número aparezca formateado con separador de miles y de decimales, te puedes ahorrar el delegado y conseguir esta salida en el data correspondiente:
Código C++:
Ver originalQVariant Model::data( ... )
{
if ( model.colum( ) == 0 && role == Qt::DisplayRole )
{
// Creo que es esta la secuencia correcta
return QString( "%L1" ).arg( lista_elements[ model.row( ) ].numero );
}
}
Cita:
Iniciado por dehm 2.- ¿Qué hago cuando necesito más información que el propio data() para formatear o mostrar un valor? Es decir, en mi caso concreto, yo quiero que el fondo de mi celda de la tabla sea de un color u otro dependiendo del valor en sí, pero también del nivel del grafo en el que se encuentra ese valor. Pero el delegado no tiene información a eso último, sólo al propio valor. Entonces, ¿cómo se puede resolver eso?
Los modelos te permiten crear tus propios roles para usos personales. El único requisito es que el identificador de dichos roles sea igual o superior a Qt::UserRole. De esta forma puedes aprovechar toda la lógica programada en el modelo para devolver la información que necesitas:
Código C++:
Ver originalclass Model : public QAbstractTableModel
{
public:
static const int CustomRole = Qt::UserRole + 1;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole ) const override
{
if ( index.isValid( ) && role == CustomRole )
return "Test";
return QVariant( );
}
};
int main( )
{
Model model;
QModelIndex index = model->index( 0, 0 );
qDebug( ) << model->data( index, Model::CustomRole );
}
Otra posibilidad es aprovechar los QModelIndex. Los modelos tienen un método sobrecargable llamado "index". Este método, junto con "parent" son los encargados de crear el mapeado de datos. Por otro lado, QModelIndex pone a tu disposición un puntero que puedes usar para que apunte a la clase que contiene la información correspondiente a la fila a la que pertenece el index (son muchos conceptos, ahora los aclaro). La idea entonces es sobrecargar "index" y "parent" para componer a mano el mapeo de datos y aprovechar esta sobrecarga para que cada "QModelIndex" apunte a la instancia correcta. Un simple cast sobre ese puntero te permite acceder a toda la información que necesites:
Código C++:
Ver originalstruct ModelData
{
int numero;
QString texto;
};
class Model : public QAbstractTableModel
{
public:
QModelIndex index(int row, int column, const QModelIndex& /*parent*/ = QModelIndex()) const override
{
if( row >= 0 && row < _data.size( ) && column >= 0 && column < 2 )
return createIndex( row, column, &_data[ row ] );
else
return QAbstractTableModel::index( row, column, parent );
}
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole ) const override
{
if ( index.isValid( ) )
{
ModelData* data = reinterpret_cast< ModelData* >( index.internalPointer( ) );
if ( index.column( ) == 0 )
return data->numero;
else
return data->texto;
}
return QVariant( );
}
private:
std::vector< ModelData > _data;
};
Queda de tu parte completar el modelo, no lo he hecho para que quedase clara la idea sobre cómo usar el puntero de QModelIndex.
Al igual que el QModelIndex que recibe "data" tiene su puntero apuntando a un elemento de "_data", el QModelIndex que recibirá el delegado también. Con esto ya deberías disponer de toda la información disponible.