Что надо понимать изначально

Много заблуждений возникает на начальном этапе освоения функционала работы с базами данных.

Обрисуем основные моменты (на наш субъективный взгляд).

Логгирование

Наверное самый правильный момент на первом этапе это сделать логгирование в исходниках Qt функций, где непосредственно формируются Sql запросы к базе данных. Ибо все в конечном счете есть запрос к базе данных: insert row, update или select. И это сразу очень многое объяснит.

Общая схема получения данных из базы такая:

Создание модели данных.

Вызов setTable. Тут делается сначала сброс всех ранее полученных данных, очистка кэша и т.д. 

Далее если нужно  формируются внешние связи через setRelation.

Формируется если нужно фильтр для запроса через setFilter.

Формируется через функцию selectStatement строка запроса для базы данных. И вот тут именно мы можем делать все, что посчитаем нужным.

Через select посылается запрос в базу и мы получаем таблицу данных.

Именно эту последовательность и надо сохранять в форке и не нарушать для совместимости.

Кэш данных

Важно разделить и понять чем отличается кэш модели данных (данные в оперативной памяти) от данных в самой базе данных и как, где и когда они синхронизирутся. Смотрите submitAll.

Огрехи

В QSqlRelation есть явная недоработка функционала, речь об этом здесь лайфхак QSqlRelationalTableModel.

Что делать

И последний момент: исходники Qt можно и нужно развивать под свои нужды, реализовывать свои идеи, добавлять новую логику, это не окончательный готовый продукт как хотелось бы подумать. Это конструктор сделай сам, за что огромный респект норвежским студентам, создателям данной библиотеки.

Вот небольшой форк QSqlTableModel : наша версия PblSqlRelationalTabelModel.