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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTreeWidget resizeColumnToContents  (Прочитано 13917 раз)
[Matrix]
Гость
« : Ноябрь 09, 2011, 22:54 »

resizeColumnToContents работает только для topLevelItem's для дочерних не ресайзится колонка, как можно это исправить? qt 4.7.4 mingw windows
Записан
andrew.k
Гость
« Ответ #1 : Ноябрь 10, 2011, 00:05 »

Видимо в момент вызова у тебя дочерние свернуты и не учитываются.
Возможно тебя устроит treeWidget->header()->setResizeMode( QHeaderView::ResizeToContents );
Это автоматически подгоняет размер секций. Но это значительно замедляет быстродействие списка.
Если элементов не много, то не страшно.
Записан
grin
Гость
« Ответ #2 : Ноябрь 10, 2011, 02:04 »

вот тут люди жалуются, что не отображаемые колонки не ресайзятся: http://www.qtcentre.org/threads/2519-treeWidgets-resizeColumnToContents-not-working-properly

treeWidget->header()->setResizeMode( QHeaderView::ResizeToContents );

из личного опыта работы с QTreeView + QAbstractItemModel - если ты добавил в модель (читай в виджет) колонку после того, как вызывал QHeaderView::serReisizeMode(QHeaderView::ResizeToContents) - то для добавленной колонки размер будет равен treeWidget->header()->defaultSectionSize(). это неверно - смотри вторую страницу

Отсюда совет - использовать QHeaderView::serReisizeMode(QHeaderView::ResizeToContents), каждый раз, после того, как ты изменил количество колонок.

« Последнее редактирование: Ноябрь 11, 2011, 17:32 от grin » Записан
[Matrix]
Гость
« Ответ #3 : Ноябрь 10, 2011, 10:14 »

да в том-то и дело, что когда дочерние были видны, я делал resizeToContents, но требования к отображению я уже реализовал
Записан
andrew.k
Гость
« Ответ #4 : Ноябрь 10, 2011, 10:38 »

Отсюда совет - использовать QHeaderView::serReisizeMode(QHeaderView::ResizeToContents), каждый раз, после того, как ты изменил количество колонок.

Это автоматически подгоняет размер секций. Но это значительно замедляет быстродействие списка.

grin, наталкивает на какие-нибудь мысли?
Записан
grin
Гость
« Ответ #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
Гость
« Ответ #6 : Ноябрь 10, 2011, 23:29 »

ну я полагаю

if(treeWidget->isVisible());
    treeWidget->setUpdatesEnabled(false);
treeWidget->header()->serResizeMode(QHeaderView::ResizeToContent);
if(treeWidget->isVisible());
    treeWidget->setUpdatesEnabled(true);
Это не спасет. Думаю, подобный код почти ничего не даст.
Проблема не в том, что перерисовывается постоянно, а в том, что пересчитывается по любому изменению данных.
Изменяешь один, а проверить надо все, чтобы найти самый широкий.

Читай ассистент снова и снова на темы setResizeMode и ResizeMode до тех пор, пока не настанет просветление.
Записан
grin
Гость
« Ответ #7 : Ноябрь 11, 2011, 01:04 »

блин, я ж прям засомневался и набросал тестик (проект приаттачил в зипе) - на убунте qt 4.8.0 - так вот - всё работает - через QHeaderView::setResizeMode(). даже для невидимых колонок дочерних айтемов, даже если содержимое этих колонок стало (runtime) больше того, по которому была выставленна ширина колонока до внесения изменений. даже если элементы (и/или) их колонки не были видны до вызова setResizeMode().

а вот resizeColumnToContents() в данном случае безбожно глючит.

касательно производительности - есть сигнатура вызова QHeaderView::setResizeMode() - где первым параметром указывается идентификатор колонки, к которой надо применить (переприменить) режим - и вызывать надо только после ДОБАВЛЕНИЯ колонки - (что право довольно редко в ходе выполнения программы) - сама по себе проверка ширины пусть даже 1000-чи элементов (не такая уж трудоёмкая задача), перерисовка этих элементов отнимает в разы больше времени.

Но это всё лирика =) как показал тот же тест, для QTreeWidget resizeMode достаточно выставить один раз, т.к. у него модель внутренняя не меняется, так что даже выставив затем можно безбоязненно добавлять колонки - их ширина будет соответствовать заданному режиму.
Записан
andrew.k
Гость
« Ответ #8 : Ноябрь 11, 2011, 01:18 »

Я не понимаю, чего ты тут не догоняешь?  Непонимающий
Прочитай ответ #4 тридцать один раз. После него обсуждать уже нечего.

setResizeMode(ResizeToContents)
перевод для танкистов: установить режим изменения размера в соответствии с содержимым.
для ваще танкистов: повторный вызов этой функции не требуется, в дальнейшем размеры обновляются автоматически.
для слесарей: коробка автомат.

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

Первый вариант учитывает все элементы списка.
Второй вариант учитывает, то ли только видимые на момент вызова функции, то ли только элементы первого уровня (topLevelItems), уже не припомню.

Ну как отпустило?
Записан
andrew.k
Гость
« Ответ #9 : Ноябрь 11, 2011, 01:20 »

видимо надо ждать еще одного проекта.  Смеющийся
Записан
andrew.k
Гость
« Ответ #10 : Ноябрь 11, 2011, 01:24 »

даже 1000-чи элементов (не такая уж трудоёмкая задача), перерисовка этих элементов отнимает в разы больше времени.

А если у тебя 10000 элементов в списке?
Что быстрее, отрисовать 40 видимых в данный момент на экране или посчитать длину в каждой колонке у 10000 элементов?

Записан
grin
Гость
« Ответ #11 : Ноябрь 11, 2011, 02:00 »

andrew.k =) забавный ты

В ответ #2 я ошибся - для QTreeWidget не надо перезадавать resizeMode после каждого изменения количества колонок (но для связки QTreeView + QAbstractItemModel - это действительно надо).

resizeColumnToContents() содержит баг в том плане, что в документации не говорится о том, что функция при ресайзе учитывает только видымые поля. Исходя из этого правильным решением (имхо) является задание resizeMode в том месте, где создаётся таблица (например в конструкторе).

З.Ы. отредактировал сообщение - удалил бессмысленный троллинг
« Последнее редактирование: Ноябрь 11, 2011, 02:20 от grin » Записан
andrew.k
Гость
« Ответ #12 : Ноябрь 11, 2011, 02:23 »

не говори глупости, просто я так и не понял, что ты хотел объяснить или доказать, когда ответ и так уже был на поверхности?
И вдобавок, пишешь сам не понимаешь чего.
Записан
andrew.k
Гость
« Ответ #13 : Ноябрь 11, 2011, 02:27 »

Для QTreeView это так же не надо как и для QTreeWidget, потому что второй это и есть первый.
Ты так и непонят, чем механика от автомата отличается. Иди спать.

Бага нет. Ты просишь функцию изменить размер, согласно содержимому (подразумевается на экране).

Я просто не вижу смысла снова писать одно и то же?
Записан
grin
Гость
« Ответ #14 : Ноябрь 11, 2011, 02:31 »

Для QTreeView это так же не надо как и для QTreeWidget, потому что второй это и есть первый.
А ты проверь - я недавно на это наткнулся - так что знаю о чём говорю =). И QTreeWidget и QTreeView - это не одно и тоже, несмотря на наследование =).

Бага нет. Ты просишь функцию изменить размер, согласно содержимому (подразумевается на экране).
Интересно, где подразумевается? в документации это не указано =)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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