2013-03-27 9 views
1

Какова стандартная практика сохранения ширины столбцов, сохраненной в QTableView, которая имеет определенные столбцы, скрытые/удаленные с помощью QSortFilterProxyModel (в произвольном порядке)? Обратите внимание, что я говорю о том, что они скрыты и скрыты в одном экземпляре.QSortFilterProxyModel breaks columnWidths

Я пробовал несколько способов (все уродливые), чтобы это произошло. Конечно, я делаю что-то неправильно.

Я посмотрел на QHeaderView :: saveState() и QHeaderView :: restoreState(), но если я что-то не хватает, это действительно полезно только для сохранения от завершения работы. Когда столбцы скрыты и невидимы в другом порядке, это прерывается.

QSortFilterProxyModel отлично работает с использованием filterAcceptsColumn(). Предостережение - это когда filterAcceptsColumn() возвращает true в столбце, который ранее возвращал false. Я запускаю invalidateFilter(), и он написан в QTableView. Тем не менее, QTableView использует какое-то значение по умолчанию (100, похоже,) для ширины столбца, а не ширину столбца до того, как QSortFilterProxyModel спрятал столбец.

Идеи?

+1

Для такого управления, разумно ли использовать QHeaderView :: setSectionHidden() и уничтожить QSortFilterProxy вместе? Другое решение, которое я начинал, но считал слишком громоздким, - это сохранить некоторый тип контейнера «реальных индексов», который, по мнению QHeaderView, является индексом. –

ответ

0

Да, используйте вместо этого setSectionHidden().

В общем, вы должны попытаться сохранить код, связанный с представлением (например, показывать/скрывать столбцы во время выполнения) из модели. В наших приложениях есть подклассы QTableView и QHeaderView, которые позволяют пользователю показывать/скрывать столбцы с помощью контекстного меню; ширина столбцов (а также позиции) не затрагиваются при их отображении/скрытии.

filterAcceptsColumn может быть использован для полного отключения столбцов, таких как первичные ключи, внешние ключи и т. Д.

+0

Спасибо, Тим. Что помогает. Из того, что я заметил, есть предостережение с использованием setSectionHidden(), а не блокирование его в QSortFilterProxModel. Иначе, paint() будет по-прежнему рисовать скрытые ячейки ... по крайней мере, когда фильтр недействителен. [OOPS EDIT:] Однако я понимаю, что вы имеете в виду. QSortFilterProxy-модель должна, вероятно, использоваться меньше для произвольной фильтрации, и больше для определенного типа предварительной фильтрации. Кажется, имеет смысл. Anywho, я думаю, что продолжу в этом режиме, так как я потратил * WAY * слишком много времени на это. :) –

Смежные вопросы