moveSection изменение порядка колонок

Ну вот и мы подошли к желанию менять интерактивно порядок колонок прямо в QTableView и запоминать его где-то для следующего запуска программы.

Оказывается переместить колонку в другое место несложно, для этого служит например метод moveSection. Далее включается внутренний механизм учета логических индексов колонок и визуальных индексов.

class QHeaderViewPrivate: public QAbstractItemViewPrivate
{
.....
mutable QVector<int> visualIndices; // visualIndex = visualIndices.at(logicalIndex)
mutable QVector<int> logicalIndices; // logicalIndex = row or column in the model
.....
}

В модели данных ничего не меняется. Select запрос остается прежним. Просто происходит подмена колонок на уровне отображения ( в QTableView ). 

Проблема, побудившая написать эту страницу, в том , что  переместить колонку через moveSection получается, а вернуть обратно как было изначально (сразу после setTable модели данных) не получается почему-то, не смотря на то, что происходит даже новый select запрос в модели данных. 

То есть QTableView  где-то внутри хранит состояние колонок и нам надо понять где.

Надо сразу сказать, что есть колонки в QTableView и есть секции в QHeaderView. И могут они жить своей независимой друг от друга жизнью.

После изучения приватного класса QHeaderViewPrivate понятно сразу, что хранится этот учет в visualIndices  и logicalIndices

Инициализируется последовательность колонок  в initializeSections()  это в QHeaderView.

Наследование QHeaderView такое:
QAbstractItemView
QAbstractScrollArea
QFrame
QWidget

И у QTableView наследование такое же:
QAbstractItemView
QAbstractScrollArea
QFrame
QWidget

То есть QHeaderView  и QTableView  как бы действительно не зависящие друг от друга виджеты.

Иницализация колонок происходит сначала в setModel класса QTableView, где в свою очередь вызывается setModel  для QHeaderView (горизонтального и вертикального):

    d->verticalHeader->setModel(model);
    d->horizontalHeader->setModel(model);