Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: andrew.k от Октябрь 07, 2010, 15:59



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

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

ПС. пробовал поставить постоянный горизонтальный скролбар. Эффекта ноль.


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: Denjs от Октябрь 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 который является "шапкой".


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 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, сейчас не до производительности).


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: AlekseyK от Октябрь 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-я колонка, а Вам нужно последнюю. Запускаю этот метод всякий раз как в таблице меняются данные по сигналу от модели.


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 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 меняю, а просто меняю размер колонки не меняя режим растягивания (зачем ограничивать пользователя?). Но оба варианта не работают (дважды оба: и мой и ваш вариант, и оба режима).


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 08, 2010, 10:38
Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? :)


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 08, 2010, 11:23
Покопался в исходниках.
QTreeView::setHeader( QHeaderView *header)
{
...
connect( d->header, SIGNAL( sectionHandleDoubleClicked( int ) ),
   this, SLOT( resizeColumnToContents( int ) ) );
...
}

Почему тогда когда я вызываю ее на прямую, ничего не происходит, когда щелкаю мышой резайзится до нужного размер?
 ???


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: Kolobok от Октябрь 08, 2010, 12:25
Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? :)

У QTreeView нет такого слота. это у QTableView.


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 08, 2010, 12:27
Путем долгих мучений, пришел к выводу, что последняя колонка у меня всегда занимает оставшееся на форме место.
Если другие колонки расширяются, то все средние двигаются, а последняя сжимается. Как убрать такое поведение?
Надо чтобы уезжала за край и отображался скроллбар.

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

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

Мне че программно делать двойной щелчок что ли?  ;D


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 08, 2010, 12:28
Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? :)

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


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: crossly от Октябрь 08, 2010, 12:32
...
Надо чтобы уезжала за край и отображался скроллбар.
...
так в ассистенте все ответы... лень читать что ли... ??
void setStretchLastSection ( bool stretch )


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: Kolobok от Октябрь 08, 2010, 12:37
Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? :)

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

Покажи мне. © Морфеус


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


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 08, 2010, 14:09
Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? :)

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

Покажи мне. © Морфеус
"так в ассистенте все ответы... лень читать что ли... ??" © crossly


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 08, 2010, 14:25
Проверил. Наконец-то. Полдня убил :)
Правда в ассистенте написано "default value is false".
делаю setStretchLastSection( false ); и получаю счастье :)


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: Kolobok от Октябрь 08, 2010, 14:44
Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? :)

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

Покажи мне. © Морфеус
"так в ассистенте все ответы... лень читать что ли... ??" © Kolobok

Мне не лень читать асистент. И прежде чем написать, я это проверил. И это
Цитировать
"так в ассистенте все ответы... лень читать что ли... ??" © Kolobok
не принадлежит мне.


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 08, 2010, 14:56
"так в ассистенте все ответы... лень читать что ли... ??" © Kolobok

Мне не лень читать асистент. И прежде чем написать, я это проверил. И это
Цитировать
"так в ассистенте все ответы... лень читать что ли... ??" © Kolobok
не принадлежит мне.
Я опечатался :) я отцитировал crossly


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 08, 2010, 15:00
Цитировать
Мне не лень читать асистент. И прежде чем написать, я это проверил. И это

А что ты скажешь на это?
resizeColumnToContents(int) (http://doc.trolltech.com/4.4/qtreeview.html#resizeColumnToContents)


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: Kolobok от Октябрь 08, 2010, 15:13
Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? :)

Найди два отличия.


Название: Re: Ресайз колонок в QTreeWidget
Отправлено: andrew.k от Октябрь 08, 2010, 15:21
Что-то я не пойму, почему у QTreeWidget нет слота resizeColumnsToContents(), которые должен наследоваться от QTreeView.
слот resizeColumnToContents( int ) присутствует тем не менее. В исходниках не нашел причины. Где он? :)

Найди два отличия.
Гыгыгы. Все срослось :)