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

Hola:

Sigo con el tema del Modelo-Vista-Delegados

Estaba haciendo delegados personalizados para las columnas de mi ejemplo, cuando he querido hacer un delegado en el cual el editor para la entrada de datos me gustaría que fuera diferente al editor que los muestre.

Mi idea es la siguiente:

El editor de entrada de datos en un QComboBox, y maneja 3 indices, cada uno con un icono y una leyenda.

El editor que muestra los datos es un QLabel, y ha de mostrar el icono que le corresponda.

Este es el código de esa parte:
Código C++:
Ver original
  1. QWidget* MiDelegado3::createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const
  2. {
  3.     Q_UNUSED (index);
  4.     Q_UNUSED (option);
  5.     QComboBox* miCombo = new QComboBox(parent);
  6.     QIcon icono1, icono2, icono3;
  7.     icono1.addFile(QStringLiteral(":/iconos/alegre.png"), QSize(), QIcon::Normal, QIcon::Off);
  8.     miCombo->addItem(icono1, "Alegre");
  9.     icono2.addFile(QStringLiteral(":/iconos/serio.png"), QSize(), QIcon::Normal, QIcon::Off);
  10.     miCombo->addItem(icono2, "Serio");
  11.     icono3.addFile(QStringLiteral(":/iconos/triste.png"), QSize(), QIcon::Normal, QIcon::Off);
  12.     miCombo->addItem(icono3, "Triste");
  13.     return miCombo;
  14. }

Y ahora la parte que me da problemas:

Modo "clásico"....esta forma me cierra el programa de forma abrupta

Código C++:
Ver original
  1. void MiDelegado3::setEditorData (QWidget * editor, const QModelIndex & index) const
  2. {
  3.     QLabel* miEditor = static_cast<QLabel*>(editor);
  4.     switch (index.data().toInt())
  5.     {
  6.     case 0:
  7.     {
  8.         miEditor->setPixmap(QPixmap(QString::fromUtf8(":/iconos/alegre.png")));
  9.         break;
  10.     }
  11.     case 1:
  12.     {
  13.         miEditor->setPixmap(QPixmap(QString::fromUtf8(":/iconos/serio.png")));
  14.         break;
  15.     }
  16.     case 2:
  17.     {
  18.         miEditor->setPixmap(QPixmap(QString::fromUtf8(":/iconos/triste.png")));
  19.         break;
  20.     }
  21.     default:
  22.         break;
  23.     }
  24. }

Mi intento:
Código C++:
Ver original
  1. void MiDelegado3::setEditorData (QWidget * editor, const QModelIndex & index) const
  2. {
  3.     QLabel* miEditor = static_cast<QLabel*>(editor);
  4.     switch (index.data().toInt())
  5.     {
  6.     case 0:
  7.     {
  8.         delete miEditor;
  9.         QLabel* miEditor = new QLabel(editor->parentWidget());
  10.         miEditor->setPixmap(QPixmap(QString::fromUtf8(":/iconos/alegre.png")));
  11.         break;
  12.     }
  13.     case 1:
  14.     {
  15.        .............................
  16. //etc
  17.     }
  18. }

El problema de esta forma es que no estoy ligando el editor al widget padre, por lo que aparece flotando en la pantalla y obviamente permanece ahí después de haber cerrado la tabla.
Pensaba que de esta forma podría ligar el editor al padre del editor que se pasa como parámetro, pero no funciona
QLabel* miEditor = new QLabel(editor->parentWidget());

En fin, como siempre, muchas gracias
__________________
Mi calculadora en Qt