Russian Qt Forum

Qt => Model-View (MV) => Тема начата: cya-st от Июнь 24, 2010, 14:35



Название: Редактирование QTableView
Отправлено: cya-st от Июнь 24, 2010, 14:35
Всем привет...
Странный глюк таблицой, если я устанавливаю setEditStrategy(QSqlTableModel::OnFieldChange);, то при редактировании ячейки в таблице, таблица перестраивается (тоесть курсор остается наместе, под курсором другая строка). При setEditStrategy(QSqlTableModel::OnManualSubmit); такого не происходит. Подскажите пожалуйста в чем проблема.


Название: Re: Редактирование QTableView
Отправлено: shirushizo от Июнь 24, 2010, 14:47
Если QSqlTableModel::OnFieldChange, то после изменения значения в ячейке представления обновляется модель, потом обновляется представление.
А если стоит QSqlTableModel::OnManualSubmit, то данные в модели не обновляются пока вызвано SubmitAll(), а просто изменяется значение в ячейках.
Так что это не проблема, так и должно быть.


Название: Re: Редактирование QTableView
Отправлено: cya-st от Июнь 24, 2010, 14:56
А почему перестраивается отображение в TableView? Как этого избежать?


Название: Re: Редактирование QTableView
Отправлено: lit-uriy от Июнь 24, 2010, 15:14
>>При setEditStrategy(QSqlTableModel::OnManualSubmit); такого не происходит.
а после того, как ты сделаешь submitAll(), происходит перестраивание таблицы?


Название: Re: Редактирование QTableView
Отправлено: cya-st от Июнь 24, 2010, 16:15
>>При setEditStrategy(QSqlTableModel::OnManualSubmit); такого не происходит.
а после того, как ты сделаешь submitAll(), происходит перестраивание таблицы?
После submitAll() тоже перестраивается


Название: Re: Редактирование QTableView
Отправлено: asvil от Июнь 24, 2010, 16:15
Цитировать
Как этого избежать?
Возможно ответ не обнадежит, но писать свою модель, так как QSqlTableModel после изменения данных при любой политике, перезагружает данные из БД.


Название: Re: Редактирование QTableView
Отправлено: cya-st от Июнь 24, 2010, 16:23
Цитировать
Как этого избежать?
Возможно ответ не обнадежит, но писать свою модель, так как QSqlTableModel после изменения данных при любой политике, перезагружает данные из БД.
В модели то что писать?


Название: Re: Редактирование QTableView
Отправлено: asvil от Июнь 24, 2010, 16:29
Реализацию QAbstractTableModel интерфейса.


Название: Re: Редактирование QTableView
Отправлено: cya-st от Июнь 24, 2010, 16:38
Реализацию QAbstractTableModel интерфейса.
У меня модель написана, какие виртуальные методы надо переопределить чтобы не перестраивалось отображение?


Название: Re: Редактирование QTableView
Отправлено: Kolobok от Июнь 24, 2010, 16:38
Ручками восстанавливай состояние view после submit. Это не QTreeView, это не сложно.


Название: Re: Редактирование QTableView
Отправлено: asvil от Июнь 24, 2010, 16:44
Надо не методы переопределить, надо чтобы emit reset() не вызывалось.
А можно так как посоветовал Колобок запоминать/выделять нужную запись в представленнии, что впринципе на нет сводит такую возможность как QAbstractItemDelegate::EndEditHint.


Название: Re: Редактирование QTableView
Отправлено: cya-st от Июнь 24, 2010, 16:47
Ручками восстанавливай состояние view после submit. Это не QTreeView, это не сложно.
Не понял что надо сделать. Как можно состояние восстановить?


Название: Re: Редактирование QTableView
Отправлено: cya-st от Июнь 24, 2010, 16:48
Надо не методы переопределить, надо чтобы emit reset() не вызывалось.
А можно так как посоветовал Колобок запоминать/выделять нужную запись в представленнии, что впринципе на нет сводит такую возможность как QAbstractItemDelegate::EndEditHint.
emit reset() так это submit надо переопределить?


Название: Re: Редактирование QTableView
Отправлено: Kolobok от Июнь 24, 2010, 16:55
Не понял что надо сделать. Как можно состояние восстановить?

Восстановить состояние скроллбаров и выделение. Для таблицы больше не надо.


Название: Re: Редактирование QTableView
Отправлено: cya-st от Июнь 24, 2010, 17:00
Не понял что надо сделать. Как можно состояние восстановить?

Восстановить состояние скроллбаров и выделение. Для таблицы больше не надо.
Поподробнее можно?


Название: Re: Редактирование QTableView
Отправлено: Kolobok от Июнь 24, 2010, 17:13
Код:
int vOffset = view->verticalScrollBar()->value();
model->submitAll();
view->verticalScrollBar()->setValue( vOffset );

примерно так.


Название: Re: Редактирование QTableView
Отправлено: asvil от Июнь 24, 2010, 17:33
Автору вроде нужно выделение записи, которая редактировалась до обновления модели.
Для этого надо запоминать primaryKey таблицы модели, затем после того как модель обновилась, искать этот primaryKey и делать, грубо говоря, setCurrentIndex() scrollTo()


Название: Re: Редактирование QTableView
Отправлено: cya-st от Июнь 24, 2010, 17:51
Всем спасибо получилось, просто после select вставил modelMain->setSort(0, Qt::AscendingOrder);. Тему можно закрывать.