От QSqlRelationalTableModel нужно не отбрасывать строки с null-значениями. Нулевое значение по умолчанию не сгодится. От чего наследоваться? QSqlRelationalTableModel или QSqlTableModel? Какой метод переопределять? selectStatement()? Пытался читать реализацию QSqlRelationalTableModel, ужасно тяжело. А какая роль во всём этом у QSqlRelation? Какие функции на этот класс возложены? Подскажите, пожалуйста, что-нибудь
другому пути решения задачи тоже буду рад, и подскажите, как редактировать своё сообщение здесь, чувствую себя кретином
Возможное решение. Для 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("представление", ...).
В делегате лишних значений не будет, но представления нужно удалять по завершении работы приложения.
Цитата(abc @ 21.1.2011, 21:06)
От QSqlRelationalTableModel нужно не отбрасывать строки с null-значениями. Нулевое значение по умолчанию не сгодится. От чего наследоваться? QSqlRelationalTableModel или QSqlTableModel? Какой метод переопределять? selectStatement()? Пытался читать реализацию QSqlRelationalTableModel, ужасно тяжело. А какая роль во всём этом у QSqlRelation? Какие функции на этот класс возложены? Подскажите, пожалуйста, что-нибудь
другому пути решения задачи тоже буду рад, и подскажите, как редактировать своё сообщение здесь, чувствую себя кретином
Начиная с 4.8 у QSqlRelationalTableModel появился метод setJoinMode(model->setJoinMode(QSqlRelationalTableModel::LeftJoin))
так что проблема закрыта.