I just paste you a part of my implementation o delegates, I hope you found it iteresting and helpul.
#include <QItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>
#include <QSpinBox>
class SpinBoxDelegate : public QItemDelegate
{
Q_OBJECT
private:
SerialStringContainer *namecontainer;
public:
SpinBoxDelegate(QObject *parent, SerialStringContainer *cont);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
SpinBoxDelegate:

pinBoxDelegate(QObject *parent, SerialStringContainer *cont)
: QItemDelegate(parent)
{
namecontainer=cont;
}
QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */, const QModelIndex &index) const
{
if(index.column()==1)
{
QComboBox *editor=new QComboBox(parent);
editor->addItem(tr("Manual")); editor->addItem(tr("Auto"));
for(int b=0;b<8;b++) editor->addItem(QString(tr("Thermometer %0 - %1")).arg(b+1).arg(namecontainer->GetString(b+9)));
return editor;
}
QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
editor->setMinimum(0);
editor->setMaximum(50.1);
editor->setSingleStep(0.2);
editor->setDecimals(1);
editor->setSuffix(tr(" °C"));
editor->installEventFilter(const_cast<SpinBoxDelegate*>(this));
return editor;
}
void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
if(index.column()==1)
{
QString qs=index.model()->data(index, Qt:

isplayRole).toString();
QComboBox *cb = static_cast<QComboBox*>(editor);
cb->setCurrentIndex(cb->findText(qs));
return;
}
QString qs=index.model()->data(index, Qt:

isplayRole).toString();
qs.remove(tr(" °C")); // Remove terminating string for proper conversion to double
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
spinBox->setValue(qs.toDouble());
}
void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
if(index.column()==1)
{
QComboBox *cb = static_cast<QComboBox*>(editor);
model->setData(index, cb->itemText(cb->currentIndex()));
return;
}
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
spinBox->interpretText();
model->setData(index,QString (tr("%1 °C")).arg(spinBox->value(),0,'f',1));
}
void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
Its more complex, but I think you will catch the idea.