Имею класс, унаследованный от QTableView. На виде разрешено перемещать колонки.
Сделан слот, который срабатывает после перемещения колонок:
void RecordTableView::sectionMoved( int logicalIndex, int oldVisualIndex, int newVisualIndex )
{
// В настройках последовательность полей меняется,
// причем новая последовательность будет сразу применена в модели
QStringList showFields=mytetraConfig.getRecordTableShowFields();
showFields.move(oldVisualIndex, newVisualIndex);
mytetraConfig.setRecordTableShowFields(showFields);
qDebug() << "New show field sequence" << showFields;
// Перемещение в данном представлении сбрасывается,
// так как модель берет последовательность полей из настроек
for(int i=0; i<showFields.size(); i++)
horizontalHeader()->moveSection(i, i);
}
Как можно видеть, у меня приложение устроено так, что достаточно поменять в настройках отображаемые поля, и модель начнет выдавать поля в новой последовательности.
Поэтому мне нужно сбросить перемещение, которое получилось при перемещении столбца. Я пытаюсь сбросить кодом:
for(int i=0; i<showFields.size(); i++)
horizontalHeader()->moveSection(i, i);
Но это не помогает как-то странно, через раз. Видимо, сбрасывать измененную последовательность полей надо как-то по-другому. Пробовал horizontalHeader()->reset(); - не помогает.
Посему два вопроса:
1. как сбросить состояние горизонтального хидера?
2. как сбросить состояние ячеек, ведь модель поменялась. Только через emit dataChanged(...), где указать область всей таблицы?
Все эти сбросы не должны повлиять на выделенную строку (она должна остаться выделенной), положение прокрутки по Y (не перепрыгивало при сбросе к первым строкам таблицы).