Russian Qt Forum
Мая 24, 2025, 21:19
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
QTreeWidget resizeColumnToContents
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QTreeWidget resizeColumnToContents (Прочитано 14497 раз)
[Matrix]
Гость
QTreeWidget resizeColumnToContents
«
:
Ноября 09, 2011, 22:54 »
resizeColumnToContents работает только для topLevelItem's для дочерних не ресайзится колонка, как можно это исправить? qt 4.7.4 mingw windows
Записан
andrew.k
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #1 :
Ноября 10, 2011, 00:05 »
Видимо в момент вызова у тебя дочерние свернуты и не учитываются.
Возможно тебя устроит treeWidget->header()->setResizeMode( QHeaderView::ResizeToContents );
Это автоматически подгоняет размер секций. Но это значительно замедляет быстродействие списка.
Если элементов не много, то не страшно.
Записан
grin
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #2 :
Ноября 10, 2011, 02:04 »
вот тут люди жалуются, что не отображаемые колонки не ресайзятся:
http://www.qtcentre.org/threads/2519-treeWidgets-resizeColumnToContents-not-working-properly
Цитата: andrew.k от Ноября 10, 2011, 00:05
treeWidget->header()->setResizeMode( QHeaderView::ResizeToContents );
из личного опыта работы с QTreeView + QAbstractItemModel - если ты добавил в модель (читай в виджет) колонку после того, как вызывал QHeaderView::serReisizeMode(QHeaderView::ResizeToContents) - то для добавленной колонки размер будет равен treeWidget->header()->defaultSectionSize().
это неверно - смотри вторую страницу
Отсюда совет - использовать QHeaderView::serReisizeMode(QHeaderView::ResizeToContents), каждый раз, после того, как ты изменил количество колонок.
«
Последнее редактирование: Ноября 11, 2011, 17:32 от grin
»
Записан
[Matrix]
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #3 :
Ноября 10, 2011, 10:14 »
да в том-то и дело, что когда дочерние были видны, я делал resizeToContents, но требования к отображению я уже реализовал
Записан
andrew.k
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #4 :
Ноября 10, 2011, 10:38 »
Цитата: grin от Ноября 10, 2011, 02:04
Отсюда совет - использовать QHeaderView::serReisizeMode(QHeaderView::ResizeToContents),
каждый раз
, после того, как ты изменил количество колонок.
Цитата: andrew.k от Ноября 10, 2011, 00:05
Это
автоматически
подгоняет размер секций. Но это значительно замедляет быстродействие списка.
grin
, наталкивает на какие-нибудь мысли?
Записан
grin
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #5 :
Ноября 10, 2011, 21:03 »
ну я полагаю
if(treeWidget->isVisible());
treeWidget->setUpdatesEnabled(false);
treeWidget->header()->serResizeMode(QHeaderView::ResizeToContents);
if(treeWidget->isVisible());
treeWidget->setUpdatesEnabled(true);
Да и честно признаться на моей практике ситуация когда надо runtime менять количество
колонок
встречается в приложениях достаточно редко. Обычно либо сразу в конструкторе, либо после задания модели для вью - что тоже выполняется далеко не каждую секунду.
«
Последнее редактирование: Ноября 10, 2011, 23:31 от grin
»
Записан
andrew.k
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #6 :
Ноября 10, 2011, 23:29 »
Цитата: grin от Ноября 10, 2011, 21:03
ну я полагаю
if(treeWidget->isVisible());
treeWidget->setUpdatesEnabled(false);
treeWidget->header()->serResizeMode(QHeaderView::ResizeToContent);
if(treeWidget->isVisible());
treeWidget->setUpdatesEnabled(true);
Это не спасет. Думаю, подобный код почти ничего не даст.
Проблема не в том, что перерисовывается постоянно, а в том, что пересчитывается по любому изменению данных.
Изменяешь один, а проверить надо все, чтобы найти самый широкий.
Читай ассистент снова и снова на темы
setResizeMode
и
ResizeMode
до тех пор, пока не настанет просветление.
Записан
grin
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #7 :
Ноября 11, 2011, 01:04 »
блин, я ж прям засомневался и набросал тестик (проект приаттачил в зипе) - на убунте qt 4.8.0 - так вот - всё работает - через QHeaderView::setResizeMode(). даже для невидимых колонок дочерних айтемов, даже если содержимое этих колонок стало (runtime) больше того, по которому была выставленна ширина колонока до внесения изменений. даже если элементы (и/или) их колонки не были видны до вызова setResizeMode().
а вот resizeColumnToContents() в данном случае безбожно глючит.
касательно производительности - есть сигнатура вызова QHeaderView::setResizeMode() - где первым параметром указывается идентификатор колонки, к которой надо применить (переприменить) режим - и вызывать надо только после ДОБАВЛЕНИЯ колонки - (что право довольно редко в ходе выполнения программы) - сама по себе проверка ширины пусть даже 1000-чи элементов (не такая уж трудоёмкая задача), перерисовка этих элементов отнимает в разы больше времени.
Но это всё лирика =) как показал тот же тест, для QTreeWidget resizeMode достаточно выставить один раз, т.к. у него модель внутренняя не меняется, так что даже выставив затем можно безбоязненно добавлять колонки - их ширина будет соответствовать заданному режиму.
Записан
andrew.k
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #8 :
Ноября 11, 2011, 01:18 »
Я не понимаю, чего ты тут не догоняешь?
Прочитай ответ #4 тридцать один раз. После него обсуждать уже нечего.
setResizeMode(ResizeToContents)
перевод для танкистов:
установить режим
изменения размера в соответствии с содержимым.
для ваще танкистов: повторный вызов этой функции не требуется, в дальнейшем размеры обновляются автоматически.
для слесарей: коробка автомат.
resizeColumnToContents
перевод для танкистов:
изменить размер
в соответствии с содежимым.
для ваще танкистов: если нужно чтобы размер подтянулся под измененившееся содержимое, вызови эту функцию еще раз. и делай так каждый раз.
для слесарей: коробка механическая.
Первый вариант учитывает
все
элементы списка.
Второй вариант учитывает, то ли
только видимые на момент вызова функции
, то ли только элементы первого уровня (topLevelItems), уже не припомню.
Ну как отпустило?
Записан
andrew.k
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #9 :
Ноября 11, 2011, 01:20 »
видимо надо ждать еще одного проекта.
Записан
andrew.k
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #10 :
Ноября 11, 2011, 01:24 »
Цитата: grin от Ноября 11, 2011, 01:04
даже 1000-чи элементов (не такая уж трудоёмкая задача), перерисовка этих элементов отнимает в разы больше времени.
А если у тебя 10000 элементов в списке?
Что быстрее, отрисовать 40 видимых в данный момент на экране или посчитать длину в каждой колонке у 10000 элементов?
Записан
grin
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #11 :
Ноября 11, 2011, 02:00 »
andrew.k =) забавный ты
В ответ #2 я ошибся - для QTreeWidget не надо перезадавать resizeMode после каждого изменения количества колонок (но для связки QTreeView + QAbstractItemModel - это действительно надо).
resizeColumnToContents() содержит баг в том плане, что в документации не говорится о том, что функция при ресайзе учитывает только видымые поля. Исходя из этого правильным решением (имхо) является задание resizeMode в том месте, где создаётся таблица (например в конструкторе).
З.Ы. отредактировал сообщение - удалил бессмысленный троллинг
«
Последнее редактирование: Ноября 11, 2011, 02:20 от grin
»
Записан
andrew.k
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #12 :
Ноября 11, 2011, 02:23 »
не говори глупости, просто я так и не понял, что ты хотел объяснить или доказать, когда ответ и так уже был на поверхности?
И вдобавок, пишешь сам не понимаешь чего.
Записан
andrew.k
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #13 :
Ноября 11, 2011, 02:27 »
Для QTreeView это так же не надо как и для QTreeWidget, потому что второй это и есть первый.
Ты так и непонят, чем механика от автомата отличается. Иди спать.
Бага нет. Ты просишь функцию изменить размер, согласно содержимому (подразумевается на экране).
Я просто не вижу смысла снова писать одно и то же?
Записан
grin
Гость
Re: QTreeWidget resizeColumnToContents
«
Ответ #14 :
Ноября 11, 2011, 02:31 »
Цитата: andrew.k от Ноября 11, 2011, 02:27
Для QTreeView это так же не надо как и для QTreeWidget, потому что второй это и есть первый.
А ты проверь - я недавно на это наткнулся - так что знаю о чём говорю =). И QTreeWidget и QTreeView - это не одно и тоже, несмотря на наследование =).
Цитата: andrew.k от Ноября 11, 2011, 02:27
Бага нет. Ты просишь функцию изменить размер, согласно содержимому (подразумевается на экране).
Интересно, где подразумевается? в документации это не указано =)
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...