Russian Qt Forum

Qt => Базы данных => Тема начата: aliks-os от Август 22, 2011, 11:04



Название: QSqlTableModel - isDirty
Отправлено: aliks-os от Август 22, 2011, 11:04
isDirty, как можно сбросить данный признак


Название: Re: QSqlTableModel - isDirty
Отправлено: lit-uriy от Август 22, 2011, 11:56
Из асистента:
"Dirty values are values that were modified in the model but not yet written into the database."
Дальше сам осилишь?


Название: Re: QSqlTableModel - isDirty
Отправлено: aliks-os от Август 22, 2011, 13:42
я сам в курсе, эту фразу я знаю наизусть.

популярно объясняю
дело в том что я пишу данные в базу не при помощи submit, а использую
updateRowInTable
insertRowIntoTable
соответственно эти функции не сбрасывают признак dirty


вот такая бяка


Название: Re: QSqlTableModel - isDirty
Отправлено: developer от Август 22, 2011, 13:59
К чему такая сложность?


Название: Re: QSqlTableModel - isDirty
Отправлено: aliks-os от Август 22, 2011, 14:07
вся эта сложность для того, чтобы при вызове submit не было вот этого

Submit()
On success the model will be repopulated. Any views presenting it will lose their selections.


Название: Re: QSqlTableModel - isDirty
Отправлено: lit-uriy от Август 22, 2011, 21:06
>>эту фразу я знаю наизусть
в классе QSqlTableModel нет никакого признака, в методе isDirty() просто сравнивается информация в кеше с информацией в модели. Обновляй каждый индекс модели в ручную.


Название: Re: QSqlTableModel - isDirty
Отправлено: aliks-os от Август 23, 2011, 10:08
>>эту фразу я знаю наизусть
в классе QSqlTableModel нет никакого признака, в методе isDirty() просто сравнивается информация в кеше с информацией в модели. Обновляй каждый индекс модели в ручную.

Что значить обновить каждый индекс вручную???


Название: Re: QSqlTableModel - isDirty
Отправлено: lit-uriy от Август 23, 2011, 10:39
setData(QModelIndex)


Название: Re: QSqlTableModel - isDirty
Отправлено: aliks-os от Август 23, 2011, 10:59
это я и так делаю


Название: Re: QSqlTableModel - isDirty
Отправлено: aliks-os от Август 23, 2011, 12:26
Вопрос решен через переопределение в модели headerData


Название: Re: QSqlTableModel - isDirty
Отправлено: lit-uriy от Август 23, 2011, 20:03
>>Вопрос решен через переопределение в модели headerData
хм, для меня не очевидно. А что ты там делаешь?


Название: Re: QSqlTableModel - isDirty
Отправлено: aliks-os от Август 25, 2011, 08:40
просто напросто редактор данных через грид, однако чтобы каждый раз при редактировании не вызывать submit (который перезагружает данные, а также теряется выделение текущей ячейки) я пошел на данные ухищрения


Название: Re: QSqlTableModel - isDirty
Отправлено: lit-uriy от Август 25, 2011, 09:52
я имел в виду, что такого делается в headerData, что позволило избавится от описанной, в теме, проблемы?


Название: Re: QSqlTableModel - isDirty
Отправлено: aliks-os от Август 26, 2011, 12:42
я имел в виду, что такого делается в headerData, что позволило избавится от описанной, в теме, проблемы?

Все делается вот таким образом

Код:
//При вставке строки присваивается номер новой строки
//При редактировании - номер редактируемой строки
int insRow =-1;  
bool showAsterisk = false;  //При редактировании меняется на true

QVariant SQLModel::headerData ( int section, Qt::Orientation orientation, int role ) const {
    if (orientation == Qt::Vertical) {
        //Когда после вставки новой строки ухожу на другую, то звездочку меняю на номер строки
        if (section != insRow && QSqlTableModel::headerData(section,Qt::Vertical) == "*") {
            return section+1;
        }
        //Если просто редактирую, то показываю звездочку
        if (showAsterisk && section == insRow) {
            return QVariant("*");
        }
    }
    return QSqlTableModel::headerData(section,orientation, role);
}


Т.Е. получается что сам признак Dirty для меня стал неактуальный для визуального отображение. Проблема была именно как корректно отображать звезду, ну вот таким способом я ее и победил


Название: Re: QSqlTableModel - isDirty
Отправлено: lit-uriy от Август 26, 2011, 21:20
ясно