Russian Qt Forum
Сентябрь 30, 2024, 12:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Делегат для редактирования и QTextEdit  (Прочитано 4081 раз)
imironchik
Гость
« : Декабрь 16, 2011, 19:28 »

Добрый день.

Подскажите, пожалуйста, каким образом уловить завершение редактирования в QTextEdit? Это нужно для того, что сделать emit commitData()... Или может у Вас есть пример использования QTextEdit в качестве редактора в делегате?!
Записан
andrew.k
Гость
« Ответ #1 : Декабрь 16, 2011, 23:03 »

отлавливай потерю фокуса, например.
Записан
imironchik
Гость
« Ответ #2 : Декабрь 17, 2011, 08:37 »

Я отлавливаю клавиатурное событие. Только вот после всего у меня в модели не меняется значение. Есть еще один нюанс: я использую для сортировки 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
Записан
imironchik
Гость
« Ответ #3 : Декабрь 17, 2011, 18:27 »

Проблема была в не совсем верной установке данных в модели: я забыл указать Qt::DisplayRole. Поэтому данные не устанавливались. Т.е.

Код:
void
setModelData( QWidget * editor, QAbstractItemModel * model,
const QModelIndex & index ) const
{
TextEdit * e = qobject_cast< TextEdit* > ( editor );
model->setData( index, e->toPlainText(), Qt::DisplayRole );
}
Записан
andrew.k
Гость
« Ответ #4 : Декабрь 18, 2011, 10:10 »

только меня одного смущает слот slotCommitAndClose?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.069 секунд. Запросов: 21.