Below is my delegate implemenation.
@class CountryDelegate :public QItemDelegate
{
Q_OBJECT
public:
virtual QWidget* createEditor ( QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
QComboBox* editor = new QComboBox( parent );
editor->installEventFilter( const_cast<CountryDelegate*>(this) );
return editor;
}
virtual void setEditorData( QWidget* editor, const QModelIndex& index ) const
{
QComboBox* combo = static_cast<QComboBox*>( editor );
combo->addItems( countries() );
int idx = CountryDelegate::countries().indexOf( index.data( Qt::DisplayRole ).toString() );
combo->setCurrentIndex( idx );
}
virtual void setModelData( QWidget * editor, QAbstractItemModel* model, const QModelIndex& index ) const
{
QComboBox* combo = static_cast<QComboBox*>( editor );
model->setData( index, combo->currentText() );
}
virtual void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
// Just a silly example, don't allow the editor to get a smaller height than its sizehint.
int hCell = option.rect.height();
int hEditor = editor->sizeHint().height();
int h = qMax( hCell, hEditor );
QSize size = option.rect.size();
size.setHeight( h );
editor->setGeometry( QRect( option.rect.topLeft() - QPoint(0,(h-hCell)/2), size ) );
}
virtual bool eventFilter( QObject* obj, QEvent* event )
{
if ( event->type() == QEvent::KeyRelease && static_cast<QKeyEvent*>(event)->key() == Qt::Key_Return ) {
emit commitData( static_cast<QWidget*>(obj) );
emit closeEditor( static_cast<QWidget*>(obj), EditNextItem );
}
return false;
}
static QStringList countries()
{
QStringList countries;
countries << "Denmark" << "Sweeden" << "Norway" << "USA" << "Germany"
<< "Poland" << "Iceland" << "Holland" << "Great Britain" << "Ireland" << "Scotland";
return countries;
}
};@