Скрещиваем QpTableView и QpSqlTableModel

Нам надо как-то связать вместе модель данных QpSqlTableModel и модель представления QpTableView.

Итак сходу скрестить QpTableView 2.2.0 и QpSqlTableModel 12.4.2 как-то не получилось. Изучаем проблемы и исправляем.

Примерно такая последовательность инициализации работы с QpTableView
new Model
  setTable
  setRelation. baseRec
  setCalc. baseRec
  select
init_section_template
model isEmpty? QAbstractItemModelPrivate::staticEmptyModel()?
new QpTableView
setHorizontalHeader
   d->horizontalHeader->setModel ? для хэдеров тоже устанавливается та же модель данных
setVerticalHeader
   d->verticalHeader->setModel
 setModel , matrix проверка с baseRec
 select

Важный для понимания момент - как определить,что модель данных еще не связана ни с одной таблицей, то есть ей не сделано еще setTable. Проверяется это так:

if( model != QAbstractItemModelPrivate::staticEmptyModel())

Причем QAbstractItemModelPrivate сделан в исходниках Qt экспортируемым, поэтому это проверку можно использовать где угодно в вашем проекте.

setHorizontalHeader в QpTableView и setModel для QpTableView могут вызываться независимо и в разной последовательности и это надо учитывать.

Не надо также создавать и хранить указатели на QpHorHeaderView где-то отдельно, так как QpHorHeaderView единожды создается в конструкторе класса QpTableView и хранится далее в его приватном классе QpTableViewPrivate.

Предусмотрено, что вы всегда можете заменить штатный хэдер через метод setHorizontalHeader (снаружи класса QpTableView).

Поэтому мы приходим к выводу, что надо ссылку на шаблон секций добавлять именно в метод setHorizontalHeader. А не как у нас было ранее в setModel, ибо setModel просто устанавливает связь модели данных и моделью представления.

Ну поскольку мы setHorizontalHeader вызываем в конструкторе QpTableView, то нам не уйти от передачи в конструктор QpTableView также ссылки на шаблон секций. Другое дело, что сама ссылка может быть и на пустой шаблон.

Нам придется делать проверку соответствия шаблона секций и модели данных в нескольких местах, соответственно в setModel и в setHorizontalHeader. Но это не сложно.