Я отлавливаю клавиатурное событие. Только вот после всего у меня в модели не меняется значение. Есть еще один нюанс: я использую для сортировки QSortFilterProxyModel.
//
// TextEdit
//
//! Editor for the delegate.
class TextEdit
: public QTextEdit
{
Q_OBJECT
signals:
void editingFinished();
public:
TextEdit( QWidget * parent = 0 )
: QTextEdit( parent )
{
}
protected:
void keyPressEvent( QKeyEvent * e )
{
if( ( e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Enter ) ||
( e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Return ) )
emit editingFinished();
else
QTextEdit::keyPressEvent( e );
}
}; // TextEdit
//
// TextDelegate
//
//! Delegate for the text's fileds.
class TextDelegate
: public QStyledItemDelegate
{
Q_OBJECT
signals:
void dataChanged();
public:
TextDelegate( QObject * parent = 0 )
: QStyledItemDelegate( parent )
{
}
QWidget *
createEditor( QWidget * parent, const QStyleOptionViewItem & option,
const QModelIndex & index ) const
{
Q_UNUSED( option );
Q_UNUSED( index );
TextEdit * editor = new TextEdit( parent );
connect( editor, SIGNAL( editingFinished() ),
this, SLOT( slotCommitAndClose() ) );
return editor;
}
void
setEditorData( QWidget * editor, const QModelIndex & index ) const
{
TextEdit * e = qobject_cast< TextEdit* > ( editor );
e->setPlainText( index.data().toString() );
}
void
setModelData( QWidget * editor, QAbstractItemModel * model,
const QModelIndex & index ) const
{
TextEdit * e = qobject_cast< TextEdit* > ( editor );
model->setData( index, e->toPlainText() );
}
void updateEditorGeometry( QWidget * editor,
const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
Q_UNUSED( index );
editor->setGeometry( option.rect );
}
private slots:
void slotCommitAndClose()
{
TextEdit * editor = qobject_cast< TextEdit* > ( sender() );
emit commitData( editor );
emit closeEditor( editor );
}
}; // class TextDelegate