QSortFilterProxyModel разбивает ширину столбца

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

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

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

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

Идеи?


person kiss-o-matic    schedule 27.03.2013    source источник
comment
Разумнее ли для такого контроля просто использовать QHeaderView::setSectionHidden() и полностью отказаться от QSortFilterProxy? Другое решение, которое я начал, но которое показалось мне слишком громоздким, - это сохранить некоторый тип контейнера реальных индексов, а не то, что QHeaderView считает индексами.   -  person kiss-o-matic    schedule 27.03.2013


Ответы (1)


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

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

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

person Tim Meyer    schedule 27.03.2013
comment
Спасибо, Тим. Что помогает. Однако из того, что я заметил, есть предостережение при использовании setSectionHidden() вместо его блокировки в QSortFilterProxModel. И это означает, что paint() по-прежнему будет рисовать скрытые ячейки... по крайней мере, когда фильтр недействителен. [OOPS EDIT:] Тем не менее, я понимаю, что вы имеете в виду. Модель QSortFilterProxy, вероятно, следует использовать меньше для произвольной фильтрации и больше для некоторого типа предустановленной фильтрации. Кажется, это имеет смысл. Во всяком случае, я думаю, что продолжу в этом режиме, так как я потратил СЛИШКОМ слишком много времени на это. :) - person kiss-o-matic; 27.03.2013