Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Октябрь 27, 2014, 23:15



Название: QTableView - как сбросить последовательность колонок?
Отправлено: xintrea от Октябрь 27, 2014, 23:15
Имею класс, унаследованный от 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 (не перепрыгивало при сбросе к первым строкам таблицы).



Название: Re: QTableView - как сбросить последовательность колонок?
Отправлено: xintrea от Октябрь 27, 2014, 23:58
Ага, вроде разобрался. Код получился такой:

Код:
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() содержимое столбца перечитывается...


Название: Re: QTableView - как сбросить последовательность колонок?
Отправлено: __Heaven__ от Ноябрь 24, 2014, 08:09
Есть еще в модельке сигнал layoutChanged. Я его использовал, чтобы обновить всю таблицу.