LINUX.ORG.RU

QTableView - как сбросить последовательность колонок?


0

1

Имею класс, унаследованный от 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;

  // Перемещение в данном представлении сбрасывается, 
  // так как модель берет последовательность полей из настроек
  horizontalHeader()->reset();
}

Как можно видеть, у меня приложение устроено так, что достаточно поменять в настройках отображаемые поля, и модель начнет выдавать поля в новой последовательности.

Поэтому мне нужно сбросить перемещение, которое получилось при перемещении столбца. Я пытаюсь сбросить кодом:

horizontalHeader()->reset();

Но это не помогает. В модели последовательность полей меняется (вижу по дебагу), а на экране - нет.

Посему два вопроса:

1. как сбросить состояние горизонтального хидера, так чтобы в нем небыло перестановки столбцов? Пусть берет данные из модели. 2. как сбросить состояние ячеек, ведь модель поменялась. Только через emit dataChanged(...), где указать область всей таблицы?

Все эти сбросы не должны повлиять на выделенную строку (она должна остаться выделенной), положение прокрутки по Y (не перепрыгивало при сбросе к первым строкам таблицы).

★★★★★

Ага, вроде разобрался. Код получился такой:

void RecordTableView::sectionMoved( int logicalIndex, int oldVisualIndex, int newVisualIndex )
{
  if(!enableMoveSection)
    return;

  // В настройках последовательность полей меняется
  QStringList showFields=mytetraConfig.getRecordTableShowFields();
  showFields.move(oldVisualIndex, newVisualIndex);
  mytetraConfig.setRecordTableShowFields(showFields);

  qDebug() << "New show field sequence" << showFields;

  enableMoveSection=false;

  // Перемещение в данном представлении сбрасывается, так как модель берет последовательность полей из настроек
  for(int logicalIdx=0; logicalIdx<showFields.size(); logicalIdx++)
  {
    int visualIdx=horizontalHeader()->visualIndex( logicalIdx );
    if( visualIdx != logicalIdx )
      horizontalHeader()->moveSection(visualIdx, logicalIdx);
  }

  enableMoveSection=true;

  horizontalHeader()->reset();
}

Приватная переменная класса enableMoveSection нужна для того, чтобы предотвратить лавинное срабатывание слота sectionMoved() при вызове moveSection() внутри слота sectionMoved().

Так заработало, и даже почему-то не нужно обновлять ячейки таблицы. Правильно меняются и заголовки, и содержимое ячеек.

Вот про содержимое ячеек - это очень странно. Вроде должны только правильно перемещаться заголовки... Или после moveSection() содержимое столбца перечитывается...

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.