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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Ресайз колонок в QTreeWidget [решено]  (Прочитано 16663 раз)
andrew.k
Гость
« : Октябрь 07, 2010, 15:59 »

Добавляю в QTreeWidget много айтемов. В QTreeWidget 4 колонки. в последней колонке возможен достаточно длинный текст.
В конце после добавления всех делаю resizeSections( QHeaderView::ResizeToContents );
Что растягивает все колонки до размера содержимого, кроме последней (в которой длинный текст). Последняя растягивается только до края формы и не более.
Два факта:
1. Если после заполнения руками сделать двойной щелчек по разделителю колонок, размер колонки выставляется правильно. Внизу появляется горизонтальная полоса прокрутки. Т.е. собственно, что требуется получить сразу.
2. Если колонку с длинным текстом поместить в середину, например, сделать предпоследней, то ресайзится сразу до нужного размера и внизу логично появляется горизонтальный скролбар.

Внимание вопрос: почему так? как добиться правильного ресайза сразу? глюк qt?

ПС. пробовал поставить постоянный горизонтальный скролбар. Эффекта ноль.
« Последнее редактирование: Октябрь 08, 2010, 14:26 от andrew.k » Записан
Denjs
Гость
« Ответ #1 : Октябрь 07, 2010, 16:10 »

думаю, правильно резайзинг делать примерно так:
(да, тут высота устанавливается, но вы поймете))))
(по крайней мере я так делаю и все что мне надо - работает)
Код:
QTreeWidgetItem *cTreeWidgetItem = .... ;

int cIntCol=2;//номер колонки
int rowHeight=25; //высота в пикселях

QSize tmpSize;
tmpSize=cTreeWidgetItem->sizeHint(cIntCol);
tmpSize.setHeight(rowHeight);
cTreeWidgetItem->setSizeHint(cIntCol,tmpSize);
фича в том, что резайзинг почему-то устанавливается "для ячейки". По максимальной ширине-высоте определяется ширина/высота колонок/столбцов.

Полагаю, вам будет достаточно установить размер ячейки для шапки-заголовка... есть там метод получения QTreeWidgetItem который является "шапкой".
« Последнее редактирование: Октябрь 07, 2010, 16:14 от Denjs » Записан
andrew.k
Гость
« Ответ #2 : Октябрь 07, 2010, 18:02 »

думаю, правильно резайзинг делать примерно так:
Код:
QTreeWidgetItem *cTreeWidgetItem = .... ;

int cIntCol=2;//номер колонки
int rowHeight=25; //высота в пикселях

QSize tmpSize;
tmpSize=cTreeWidgetItem->sizeHint(cIntCol);
tmpSize.setHeight(rowHeight);
cTreeWidgetItem->setSizeHint(cIntCol,tmpSize);
фича в том, что резайзинг почему-то устанавливается "для ячейки". По максимальной ширине-высоте определяется ширина/высота колонок/столбцов.
Ерунда какая-то.

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

Тем более руками ресайзить каждый айтем, это посинеешь ждать (я журнал отображаю, так что там десятки тысяч айтемов, позже буду переделывать под MVC, сейчас не до производительности).
Записан
AlekseyK
Гость
« Ответ #3 : Октябрь 07, 2010, 20:42 »

Я так делаю:

Код
C++ (Qt)
void CFileBrowser::setStretchColumnsWidth()
{
   resizeColumnToContents(0);
   for(int i = 1; i < header()->count(); i++)
       header()->setResizeMode(i, QHeaderView::Stretch);
}

только в моём случае - это 1-я колонка, а Вам нужно последнюю. Запускаю этот метод всякий раз как в таблице меняются данные по сигналу от модели.
Записан
andrew.k
Гость
« Ответ #4 : Октябрь 08, 2010, 10:19 »

Я так делаю:

Код
C++ (Qt)
void CFileBrowser::setStretchColumnsWidth()
{
   resizeColumnToContents(0);
   for(int i = 1; i < header()->count(); i++)
       header()->setResizeMode(i, QHeaderView::Stretch);
}

только в моём случае - это 1-я колонка, а Вам нужно последнюю. Запускаю этот метод всякий раз как в таблице меняются данные по сигналу от модели.
В этом и проблема Улыбающийся 1-ая колонка ресайзится как надо. А последняя нет! Я пробовал и Stretch и ResizeToContents
Только я не resizeMode меняю, а просто меняю размер колонки не меняя режим растягивания (зачем ограничивать пользователя?). Но оба варианта не работают (дважды оба: и мой и ваш вариант, и оба режима).
Записан
andrew.k
Гость
« Ответ #5 : Октябрь 08, 2010, 10:38 »

Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? Улыбающийся
Записан
andrew.k
Гость
« Ответ #6 : Октябрь 08, 2010, 11:23 »

Покопался в исходниках.
QTreeView::setHeader( QHeaderView *header)
{
...
connect( d->header, SIGNAL( sectionHandleDoubleClicked( int ) ),
   this, SLOT( resizeColumnToContents( int ) ) );
...
}

Почему тогда когда я вызываю ее на прямую, ничего не происходит, когда щелкаю мышой резайзится до нужного размер?
 Непонимающий
Записан
Kolobok
Гость
« Ответ #7 : Октябрь 08, 2010, 12:25 »

Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? Улыбающийся

У QTreeView нет такого слота. это у QTableView.
Записан
andrew.k
Гость
« Ответ #8 : Октябрь 08, 2010, 12:27 »

Путем долгих мучений, пришел к выводу, что последняя колонка у меня всегда занимает оставшееся на форме место.
Если другие колонки расширяются, то все средние двигаются, а последняя сжимается. Как убрать такое поведение?
Надо чтобы уезжала за край и отображался скроллбар.

Еще наблюдение.
list->header()->resizeSection( 3, 1000 );
list->header()->resizeToContents( QHeaderView::ResizeToContents );

После этого колонка остается шириной в 1000 писелов, не смотря на то что текста в ней меньше. И опять таки двойной щелчек приводит ее к нужному размеру.

Мне че программно делать двойной щелчок что ли?  Смеющийся
Записан
andrew.k
Гость
« Ответ #9 : Октябрь 08, 2010, 12:28 »

Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? Улыбающийся

У QTreeView нет такого слота. это у QTableView.
Ты не прав.
Записан
crossly
Гость
« Ответ #10 : Октябрь 08, 2010, 12:32 »

...
Надо чтобы уезжала за край и отображался скроллбар.
...
так в ассистенте все ответы... лень читать что ли... ??
void setStretchLastSection ( bool stretch )
Записан
Kolobok
Гость
« Ответ #11 : Октябрь 08, 2010, 12:37 »

Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? Улыбающийся

У QTreeView нет такого слота. это у QTableView.
Ты не прав.

Покажи мне. © Морфеус
Записан
andrew.k
Гость
« Ответ #12 : Октябрь 08, 2010, 14:06 »

...
Надо чтобы уезжала за край и отображался скроллбар.
...
так в ассистенте все ответы... лень читать что ли... ??
void setStretchLastSection ( bool stretch )
Ппц. Проглядел. Зациклился на ресайзмоде Улыбающийся
Спасибо. Ща проверю. Похоже это оно.
Записан
andrew.k
Гость
« Ответ #13 : Октябрь 08, 2010, 14:09 »

Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? Улыбающийся

У QTreeView нет такого слота. это у QTableView.
Ты не прав.

Покажи мне. © Морфеус
"так в ассистенте все ответы... лень читать что ли... ??" © crossly
« Последнее редактирование: Октябрь 08, 2010, 14:55 от andrew.k » Записан
andrew.k
Гость
« Ответ #14 : Октябрь 08, 2010, 14:25 »

Проверил. Наконец-то. Полдня убил Улыбающийся
Правда в ассистенте написано "default value is false".
делаю setStretchLastSection( false ); и получаю счастье Улыбающийся
« Последнее редактирование: Октябрь 08, 2010, 14:27 от andrew.k » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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