Russian Qt Forum
Апрель 25, 2024, 09:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView - как сбросить последовательность колонок?  (Прочитано 2709 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Октябрь 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 (не перепрыгивало при сбросе к первым строкам таблицы).

Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Октябрь 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() содержимое столбца перечитывается...
Записан

Собираю информацию по крупицам
http://webhamster.ru
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Ноябрь 24, 2014, 08:09 »

Есть еще в модельке сигнал layoutChanged. Я его использовал, чтобы обновить всю таблицу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.