Russian Qt Forum

Qt => Базы данных => Тема начата: PavelVX от Май 23, 2011, 10:22



Название: QSqlRelationalTableModel не находит значение ключа.
Отправлено: PavelVX от Май 23, 2011, 10:22
немного переделанный пример из интернета:
    QSqlRelationalTableModel * albumsRelation = new QSqlRelationalTableModel(this);
    albumsRelation->setTable("public.zakaz");
    albumsRelation->setRelation(1, QSqlRelation("public.polu1", "\"KODPL\"", "\"NAIM\""));
    ComboBoxDelegateCaption * comboClient = new ComboBoxDelegateCaption(this); /*мой делегат*/

Когда я пытаюсь редактировать таблицу, то значения меняются не всегда. Нашел отладчиком и место проблемы:
( QSqlRelationalTableModel.cpp)

bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value,
                                       int role)
{
    Q_D(QSqlRelationalTableModel);
    if ( role == Qt::EditRole && index.column() > 0 && index.column() < d->relations.count()
            && d->relations.value(index.column()).isValid()) {
        QRelation &relation = d->relations[index.column()];
        if (!relation.isDictionaryInitialized())
            relation.populateDictionary();
        if (!relation.dictionary.contains(value.toString()))
            return false;
    }
    return QSqlTableModel::setData(index, value, role);
}

метод relation.dictionary.contains(value.toString()) не находит значение в
QHash<QString, QVariant> dictionary;//maps keys to display values! :(

Начал переделывать этот фаил, но изменения не компилируются.
Всвязи с этим вопрос: что делать? Как мне посмотреть содержимое QHash или как перекомпилировть этот файлик, что бы он принял отладочные изменения?


Название: Re: QSqlRelationalTableModel не находит значение ключа.
Отправлено: pokidoff от Май 23, 2011, 12:40
Перекомпиль проект в папке %QT_HOME_DIR%\qt\src\sql\sql.pro но незабудь забэкапиться. Ты получишь новую дллку QSql4.dll


Название: Re: QSqlRelationalTableModel не находит значение ключа.
Отправлено: PavelVX от Май 24, 2011, 11:12
спасибо! Получилось как надо.
Но всплыл новый глюк: в QHash попадает всего 256 записей! (model->rowCount()) Хотя там явно больше.
Это системное ограничение, или глюк? :(
Поэтому и часть значений не попадает и не обрабатывается.
Посоветуйте, как понять, где именно в данном случае искать косяк? :(

сам спросил, сам и отвечаю, ответ нашел в инете.
Может кому-нибудь это поможет в дальнейшем не тратить столько времени и сил :(.
Select в QSqlTableModel запрашивает только первые 256 записей. Чтобы полностью заполнить модель надо делать так:

QSqlRelationalTableModel.cpp

model->select();
while(model->canFetchMore())
        model->fetchMore();          //без этого она берет только первые 256 записей, <censored!>

Получается, что нужно немного подправить класс и перекомпилить его. Тогда все нормально работает.
И вообще, зачем они этот гемор придумали??

Вопрос к знатокам: я под линем так же смогу сделать нужные изменения в классе моделей и перекомпилить библиотеку и пользоваться подправленной моделью? Правильно ли это? Или есть более правильный метод?


Название: Re: QSqlRelationalTableModel не находит значение ключа.
Отправлено: pokidoff от Май 25, 2011, 11:24
Цитировать
И вообще, зачем они этот гемор придумали??
Тут явная забота о пользователе - чтобы он не состарился, пока модель заполняется выборкой в несколько миллионов записей.
Опыт показывает, что пользователь не будет работать с огромной выборкой, достаточно увидеть 256 записей или уточнить запрос.


Название: Re: QSqlRelationalTableModel не находит значение ключа.
Отправлено: like-nix от Май 27, 2011, 11:13
>Вопрос к знатокам: я под линем так же смогу сделать нужные изменения в классе моделей и перекомпилить библиотеку и пользоваться подправленной моделью? Правильно ли это? Или есть более правильный метод?

Насколько я помню это запрещает LGPLv3.