QSqlRelationalTableModel не позволяет получить доступ к id полю внешней связи и это создаёт очень много неудобств. Более того сама реализация этого класса весьма сомнительна и создаётся впечатление, что это не законченная поделка (будем говорить прямо).
Возможно вам тоже покажется, что развитие Qt как минимум в части Sql остановилось этак лет 15 назад.
А ведь фреймворк заслуживает развития ибо базовые классы уровня QSqlTabelModel и QTableView предоставляют богатый функционал для реализации ваших запросов.
Итак речь пойдет о версии Qt 4.8.1 (как ни странно), помните такую - Nokia connecting people.
Главная проблема в том, что фреймворк не так прост как кажется. Огромный объем кода, где каждая строчка имеет значение в буквальном смысле этого слова. Все по делу во всем надо разобраться и порог вхождения не пару лет месье…
Предлагаем вашему вниманию развитие классов QSqlTableModel/QTableView, с вашего позволения обзовем их PblSqlRelationalTableModel/PblTableModel. Префикс Pbl мы придумали от имени создателя Pablo (не Public как может показаться), но это все в общем-то неважно, главное отличать классы от родных Qt-ых.
Итак, что мы хотим? Мы хотим в нашем приложении на с++, которое работает с базой данных, QSlite3 к примеру, иметь возможность отрыть любую таблицу в диалоге и увидеть элементы управления: кнопки добавить, копировать, удалить строку. Также нам не помешает увидеть кнопки поиска по колонкам, отбор по значению поля, сортировку по колонке.
Но самое наверное заветное нам хотелось бы увидеть подстановку в поле с внешней связью текстовой замены поля id по данным другой связанной таблицы. И больше никогда не возвращаться к этой проблеме.
Ну и когда все уже начинает работать как надо нам, выясняется, что добавить вычисляемые поля к функционалу наших классов по данным других таблиц тоже не проблема.
https://github.com/PavelDorofeev/Fork-Sql-Qt-4.8.1--SQLite-3--relations--calc-fields