Ver Mensaje Individual
  #8 (permalink)  
Antiguo 16/03/2015, 07:45
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Qt. Delegados. Usar diferente widget para editar y para mostrar

Te has liado. Como te comenté, los iconos se establecen en el rol "DecorationRole" no en "DisplayRole":

Código C++:
Ver original
  1. if (index.column()==3)
  2.         {
  3.             if (role == Qt::DecorationRole)
  4.             {
  5.                 return iconos[persona[index.row()].estado]; //devuelvo un QIcon
  6.             }
  7.         }

Por otro lado, entiendo que no es algo idóneo el tener información duplicada. Lo suyo sería crear una clase que almacene los iconos... no se, quizás algo del tipo:

Código C++:
Ver original
  1. class Resources
  2. {
  3.   public:
  4.     static std::vector< QPixmap > GetIcons( );
  5. };

Con un diseño de este tipo, tanto el modelo como el editor pueden acceder a la misma fuente de iconos.

Y, para terminar. Cuando se editan datos en el modelo no se ha de usar "DecorationRole", sino "EditRole". Por supuesto, para que esto funcione, tienes que sobrecargar el método "setData" del modelo para que, dados un index, un QVariant y un rol (EditRole por defecto) sea capaz de modificar la información almacenada en el modelo:

Código C++:
Ver original
  1. bool MiModelo::setData(const QModelIndex & index, const QVariant & value, int role )
  2. {
  3.   bool to_return = false;
  4.  
  5.   if ( index.column( ) == 3 && role == Qt::EditRole )
  6.   {
  7.     // "value", que es un int, te indica el id del icono seleccionado.
  8.     // Aquí tienes que actualizar el elemento correspondiente.
  9.     to_return = true;
  10.   }
  11.  
  12.   return to_return;
  13. }

Bueno, matizo. Si en "setData", cambias "EditRole" por "DisplayRole", entonces podrás guardar cosas usando "DisplayRole", pero no es el comportamiento por defecto. El editor predeterminado intentará modificar tu modelo usando "EditRole", por lo que lo lógico es que te amoldes al uso estándar de la función para evitar problemas (si, por ejemplo, cambias de widget por uno que has comprado).

Un saludo.

Última edición por eferion; 16/03/2015 a las 07:53