![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
abc |
![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 221 Регистрация: 16.12.2010 Из: СПб Пользователь №: 2272 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
От QSqlRelationalTableModel нужно не отбрасывать строки с null-значениями. Нулевое значение по умолчанию не сгодится. От чего наследоваться? QSqlRelationalTableModel или QSqlTableModel? Какой метод переопределять? selectStatement()? Пытался читать реализацию QSqlRelationalTableModel, ужасно тяжело. А какая роль во всём этом у QSqlRelation? Какие функции на этот класс возложены? Подскажите, пожалуйста, что-нибудь
другому пути решения задачи тоже буду рад, и подскажите, как редактировать своё сообщение здесь, чувствую себя кретином |
|
|
![]() |
abc |
![]()
Сообщение
#2
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 221 Регистрация: 16.12.2010 Из: СПб Пользователь №: 2272 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
Возможное решение. Для PostgreSQL
QSqlRelationalTableModel результирующий запрос делает такого вида: select таблица1.поле1, таблица2.поле2 from таблица1, таблица2 where условие подмены Такой запрос скрывает строки с null, а вот такой не скрывает: select таблица2.поле from таблица1 left outer join таблица2 on условие подмены Этот запрос нужно родить и вернуть в методе selectStatement() Нюансы. Запрос на замену нескольких колонок: select таблица2.поле, таблица3.поле from таблица1 left outer join таблица2 on условие подмены left outer join таблица3 on условие подмены и т.д. Если две колонки подменяете данными из одной таблицы, то в запросе нужно использовать различные псевдонимы для этой таблицы: select псевдоним1.поле, псевдоним2.поле from таблица1 left outer join таблица2 псевдоним1 on условие подмены left outer join таблица2 псевдоним2 on условие подмены и т.д. Можно наследоваться от QSqlTableModel, можно от QSqlRelationalTableModel. Во втором случае останется возможность редактировать модель с помощью стандартного делегата QSqlRelationalDelegate, но нужно будет проделать по-старинке setRelation. И это замедлит загрузку модели. Без этого показывается мгновенно. По редактированию такая проблема, что если вы берёте подменяющие значения из таблицы с множеством записей, из которых вам нужны не все, то напрашивается желание получить фильтр в setRelation. Как это сделать не знаю, но можно воспользоваться возможностью sql-представлений: create view представление as select колонка1, колонка2 from таблица where фильтр Дальше вместо setRelation("таблица", ...) делаем setRelation("представление", ...). В делегате лишних значений не будет, но представления нужно удалять по завершении работы приложения. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 22.7.2025, 23:10 |