Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: SpiritFire от Декабрь 28, 2009, 21:36



Название: Установить виджет в QHeaderView
Отправлено: SpiritFire от Декабрь 28, 2009, 21:36
Скажите, пожалуйста, каким образом можно по аналогии с QTableWidget добавить произвольный виджет в заголовок таблицы?

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

Зачем это нужно: В заголовке таблицы есть выпадающее меню. Выпадающее меню управляет фильтром для таблицы. Меню-фильтр с чекбоксами написать не проблема, проблема в следующем - как добавить произвольную кнопку в заголовок? Также было бы неплохо (но это уже более сомнительный вариант) добавить туда "канцелярскую кнопку" которая при нажатии жестко закрепит на экране столбец (сделает независимым от горизонтального скроллинга).

PS. Я видел, что у этого решения есть много сторонников и много противников. Плюсы и минусы отлично понимаю:

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

+ если нужен фильтр, но не хочется отдавать фильтру много места на экране это удачная идея: есть фильтр, который абсолютно не занимает места на экране
+ если сделать кнопку, которая прямо кричит "я фильтр, а не что иное" - люди легко догадаются, зачем это нужно

Где это уже использовалось:
* проводник Windows 7. Именно в таком виде. И нельзя не заметить, что в этом случае (проводник) это оптимальная фильтрация с точки зрения занимаемого места и "незагромождения" экрана. ИМХО, очень удобная, для отфильтрации трех экселевских документов из общей кучи в 50 файлов это более чем удобно.
* семейство компонент-таблиц от Devexpress. У них таблицы судя по демкам перегруженные, но можно сделать лучше.
* почта.

В общем, вопрос в не в том, нужно ли это, и не в том, когда это нужно, а в том, каким образом это реализовать там, где требуется?


ЗЗЫ. Прошу прощения за тучу букв, и может, слишком подробное описание -- вопрос описан очень подробно не потому, что я считаю участников форума не догадливыми (совсем наоборот), а лишь потому, что видел, что вопрос по сходной теме перерос в 4-х страничный флуд "а зачем?". Еще раз прошу - направьте, пожалуйста, "КАК", а зачем - это уже на моей ответственности.


Название: Re: Установить виджет в QHeaderView
Отправлено: crossly от Декабрь 28, 2009, 23:43
берем виджет... суем его в лэйаут... и делаем setLayout хидеру...


Название: Re: Установить виджет в QHeaderView
Отправлено: SpiritFire от Декабрь 29, 2009, 13:15
Вы имеете ввиду QWidget::setLayout? Наверное вы меня не правильно поняли - мне не нужно вмето хидера или поверх него отрисовывать другой виджет. не нужно в определенную ячейку засунуть произвольный виджет. В случае отрисовки "его надо" поверх хидера появляется куча проблем с позиционированием и отображением текста заголовка.

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


Название: Re: Установить виджет в QHeaderView
Отправлено: Dendy от Декабрь 29, 2009, 16:38
crossly именно про это и говорил. После header->setLayout(...) кнопка в лейоуте разместится на QHeaderView и будет там жить. А её положение будет меняться из переопределённого метода в вашем лейоуте, который в зависимости от дополнительных параметров уже будет знать какой колонке эта кнопка принадлежит и тому подобное.