Ver Mensaje Individual
  #7 (permalink)  
Antiguo 16/03/2015, 06:39
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Qt. Delegados. Usar diferente widget para editar y para mostrar

Hola eferion:

Disculpa que sea tan pesado.
Bueno, el caso es que efectivamente tenía el concepto equivocado de cómo funcionaban los métodos createEditor() y setEditorData().//mas bien este ultimo

Pero sigo sin tener claro quién se encarga de manejar los iconos.
Voy a ver si consigo esquematizar las cosas:

Por un lado me interesa desacoplar la información de la columna con su icono, porque éste último sólo es una ayuda a la visualización, pero no un dato en sí.
Entonces mi "fuente de datos" no he de tocarla:
Código C++:
Ver original
  1. struct Persona
  2. {
  3.     QString Nombre;
  4.     QString Sexo;
  5.     int Edad;
  6.     eEstado estado;
  7. };

Pero por otra parte, entiendo que es el modelo el que ha de gestionar esos iconos. La verdad es que pensaba que era el propio delegado. Esta parte que me comentas de que el delegado sólo sirve para editar datos....yo pensaba que también es el encargado de mostrarlos :-|

Bueno, pero incorporo esto al modelo:
*.h
Código C++:
Ver original
  1. private:
  2.  
  3.     Persona persona[FILAS];
  4.     QStringList cabecera;
  5.     QIcon iconos[3];

*.cpp
Código C++:
Ver original
  1. MiModelo::MiModelo(QObject *parent) : QAbstractTableModel(parent)
  2. {
  3. ------------------------
  4. iconos[0].addFile(QStringLiteral(":/iconos/alegre.png"), QSize(), QIcon::Normal, QIcon::Off);
  5.     iconos[1].addFile(QStringLiteral(":/iconos/serio.png"), QSize(), QIcon::Normal, QIcon::Off);
  6.     iconos[2].addFile(QStringLiteral(":/iconos/triste.png"), QSize(), QIcon::Normal, QIcon::Off);

Y cuando le sirvo el dato a la vista, hago así en el método data() del modelo:
Código C++:
Ver original
  1. if (index.column()==3)
  2.     {
  3.         if (role == Qt::DisplayRole)
  4.         {
  5.             return iconos[persona[index.row()].estado]; //devuelvo un QIcon
  6.         }
  7.     }

Y ahora, en el delegado hago así:
Código C++:
Ver original
  1. void MiDelegado3::setModelData (QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const
  2. {
  3.     QComboBox* miCombo = static_cast<QComboBox*>(editor);
  4.     model->setData(index, miCombo->currentText(), Qt::DisplayRole);
  5. }

Pero esto, además de no funcionar, me obliga a tener duplicadas los arrays de iconos, uno para el modelo y otro para el delegado (para alimentar al QComboBox) y sospecho que no es esa la mejor forma de enfocar el tema.

¿En que me estoy equivocando?

Gracias de nuevo
__________________
Mi calculadora en Qt