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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlRelationalTableModel не находит значение ключа.  (Прочитано 3929 раз)
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 или как перекомпилировть этот файлик, что бы он принял отладочные изменения?
Записан
pokidoff
Гость
« Ответ #1 : Май 23, 2011, 12:40 »

Перекомпиль проект в папке %QT_HOME_DIR%\qt\src\sql\sql.pro но незабудь забэкапиться. Ты получишь новую дллку QSql4.dll
Записан
PavelVX
Гость
« Ответ #2 : Май 24, 2011, 11:12 »

спасибо! Получилось как надо.
Но всплыл новый глюк: в QHash попадает всего 256 записей! (model->rowCount()) Хотя там явно больше.
Это системное ограничение, или глюк? Грустный
Поэтому и часть значений не попадает и не обрабатывается.
Посоветуйте, как понять, где именно в данном случае искать косяк? Грустный

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

QSqlRelationalTableModel.cpp

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

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

Вопрос к знатокам: я под линем так же смогу сделать нужные изменения в классе моделей и перекомпилить библиотеку и пользоваться подправленной моделью? Правильно ли это? Или есть более правильный метод?
« Последнее редактирование: Май 25, 2011, 07:42 от PavelVX » Записан
pokidoff
Гость
« Ответ #3 : Май 25, 2011, 11:24 »

Цитировать
И вообще, зачем они этот гемор придумали??
Тут явная забота о пользователе - чтобы он не состарился, пока модель заполняется выборкой в несколько миллионов записей.
Опыт показывает, что пользователь не будет работать с огромной выборкой, достаточно увидеть 256 записей или уточнить запрос.
Записан
like-nix
Гость
« Ответ #4 : Май 27, 2011, 11:13 »

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

Насколько я помню это запрещает LGPLv3.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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