Как улучшить QSqlRelationalTableModel

фотка 1

Класс
QSqlRelationalTableModel последний в иерархии исходников Qt. И он сделан так, что от него нельзя наследовать QSqlRelationalTableModelPrivate.

Это означает, что в наследнике мы не сможем получить доступ к скрытому QSqlRelationalTableModelPrivate классу.

У QSqlRelationalTableModel нет protected конструктора для того, чтобы ему передать указатель на приватный класс наследника и как позже выяснится еще много чего не так организовано.Но все это можно исправить. Вопрос надо ли развивать этот класс, может разумнее сделать свой вариант QpSqlTabelModel.

От QSqlRelationalTableModel не получится сходу как от QSqlTableModel унаследоваться и получить новое развитие класса.

как расширить функционал QSqlTableModel.

Но это можно поправить немного перестроив QSqlRelationalTableModel.

Есть важный нюанс наследник должен быть частью исходников библиотеки QtSources каталога src/sql/models и собираться вместе с исходниками Qt.

Объявления классов QRelation,.. необходимо перенести из файла qsqlrelationaltablemodel.cpp в h файл (qsqlrelationaltablemodel.h), объявление приватного класса QSqlRelationalTableModelPrivate в qsqlrelationaltablemodel_p.h.

Если вы объявляете классы в файле cpp, то подключать эти классы в другом cpp файле становиться проблемматично.

фотка 2

Для "нормального" наследования все объявления надо выносить в h файлы, а всю "реализацию" в cpp файлы.

Добавим новый функционал, к примеру реализуем дополнительные колонки по данным других таблиц.

К примеру реализуем функцию sum по колонке другой таблицы.

То есть переопределим virtual selectStatement, добавив LEFT JOIN к запросу.

Pourquoi par? Monseiur. (Почему бы нет месье).

Ниже прикреплен первый вариант развития QSqlRelationTableModelEx, в котором к QSqlRelationTableModel добавлен функционал получения sum, count, max, min из данных других таблиц.

Пока тестировали только с SQLite.

Файлы для скачивания

* Развитие класса QSqlRelationalTableModelEx [zip]
Qt 4.8.1 QSqlRelationalTableModel расширен новыми возможностями, запрос по нескольким таблицам для вычисления sum,count и т.д.