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

Otro delegado para la columna de edad. En este caso la idea es usar expresiones regulares para limitar la entrada a números y además colorear las celdas en función de la edad:

midelegado2.cpp

Código C++:
Ver original
  1. #include "midelegado2.h"
  2.  
  3. #include <QLineEdit>
  4. #include <QRegExpValidator>
  5. #include <QPainter>
  6.  
  7. MiDelegado2::MiDelegado2(QWidget *parent) : QStyledItemDelegate(parent) {}
  8.  
  9. QWidget * MiDelegado2::createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const
  10. {
  11.     Q_UNUSED (index);
  12.     Q_UNUSED (option);
  13.     QLineEdit* miEditor = new QLineEdit(parent);
  14.     QRegExpValidator* validadorEdad = new QRegExpValidator(QRegExp("[0-9]{1,2}"),miEditor);
  15.     miEditor->setValidator(validadorEdad);
  16.     return miEditor;
  17. }
  18.  
  19. void MiDelegado2::setEditorData ( QWidget * editor, const QModelIndex & index ) const
  20. {
  21.     QLineEdit* miEditor = static_cast<QLineEdit*>(editor);
  22.     miEditor->setText(QString::number(index.data().toInt()));
  23. }
  24.  
  25. void MiDelegado2::setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const
  26. {
  27.     QLineEdit* miEditor = static_cast<QLineEdit*>(editor);
  28.     model->setData(index,miEditor->text());
  29. }
  30.  
  31. void MiDelegado2::updateEditorGeometry ( QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index ) const
  32. {
  33.     Q_UNUSED (index);
  34.     editor->setGeometry(option.rect);
  35. }
  36.  
  37. void MiDelegado2::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
  38. {
  39.     QColor colorInfantil(Qt::green);
  40.     QColor colorMadurez(Qt::yellow);
  41.     QColor colorVejez(Qt::red);
  42.     painter->save();
  43.     if (index.data().toInt()>=0 && index.data().toInt()<25)
  44.     {
  45.         painter->fillRect(option.rect,colorInfantil);
  46.     }
  47.     else if (index.data().toInt()>=25 && index.data().toInt()<65)
  48.     {
  49.         painter->fillRect(option.rect,colorMadurez);
  50.     }
  51.     else if (index.data().toInt()>=65)
  52.     {
  53.         painter->fillRect(option.rect,colorVejez);
  54.     }
  55.     QPen colorTexto(Qt::black);
  56.     painter->setPen(colorTexto);
  57.     painter->drawText(option.rect,Qt::AlignCenter,index.data().toString());
  58.     painter->restore();
  59. }

Y por último, para ensayar con el tema de ver la información en forma de iconos, tengo un campo de estado de ánimo. Y este es el que no funciona:

midelegado3.cpp

Código C++:
Ver original
  1. #include "midelegado3.h"
  2. #include <QComboBox>
  3. #include <QLabel>
  4. #include <QDebug>
  5.  
  6.  
  7. MiDelegado3::MiDelegado3(QWidget *parent) : QStyledItemDelegate(parent) {}
  8.  
  9. QWidget* MiDelegado3::createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const
  10. {
  11.     Q_UNUSED (index);
  12.     Q_UNUSED (option);
  13.     QComboBox* miCombo = new QComboBox(parent);
  14.     QIcon icono1, icono2, icono3;
  15.     icono1.addFile(QStringLiteral(":/iconos/alegre.png"), QSize(), QIcon::Normal, QIcon::Off);
  16.     miCombo->addItem(icono1, "Alegre");
  17.     icono2.addFile(QStringLiteral(":/iconos/serio.png"), QSize(), QIcon::Normal, QIcon::Off);
  18.     miCombo->addItem(icono2, "Serio");
  19.     icono3.addFile(QStringLiteral(":/iconos/triste.png"), QSize(), QIcon::Normal, QIcon::Off);
  20.     miCombo->addItem(icono3, "Triste");
  21.     return miCombo;
  22. }
  23.  
  24. void MiDelegado3::setEditorData (QWidget * editor, const QModelIndex & index) const
  25. {
  26.     QComboBox* miEditor = static_cast<QComboBox*>(editor);
  27.  
  28.     switch (index.data().toInt())
  29.     {
  30.     case 0:
  31.     {
  32.  
  33.         //model->setData( index, miEditor->currentIndex( ) );
  34.         //otro->setPixmap(QPixmap(QString::fromUtf8(":/iconos/alegre.png")));
  35.         break;
  36.     }
  37.     case 1:
  38.     {
  39.         //miEditor->setPixmap(QPixmap(QString::fromUtf8(":/iconos/serio.png")));
  40.         break;
  41.     }
  42.     case 2:
  43.     {
  44.         //miEditor->setPixmap(QPixmap(QString::fromUtf8(":/iconos/triste.png")));
  45.         break;
  46.     }
  47.     default:
  48.         break;
  49.     }
  50. }
  51.  
  52. void MiDelegado3::setModelData (QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const
  53. {
  54.     QComboBox* miCombo = static_cast<QComboBox*>(editor);
  55.     model->setData(index,miCombo->currentIndex());
  56. }

(sigue)
__________________
Mi calculadora en Qt