Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Павел_F. от Ноябрь 02, 2009, 14:08



Название: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Павел_F. от Ноябрь 02, 2009, 14:08
Цель получить QTableWidget у которого никогда не появятся scrollBar'ы. Для этого надо задать minimumSize для QTableWidget. Чтобы его задать его надо посчитать...
Пока дошел до такого:
Код:
QSize Size( 0, 0);

 
  for( int i = 0; i < Table->columnCount(); i++)
  {
    Size.setWidth( Size.width() + Table->columnWidth ( i));
  }
  Size.setWidth( Size.width() + Table->verticalHeader()->width());
  for( int i = 0; i < Table->rowCount(); i++)
  {
    Size.setHeight( Size.height() + Table->rowHeight( i));
  }
  Size.setHeight( Size.height() + Table->horizontalHeader()->height());
Но этого не хватает. Кроме заголовков, колонок и строк есть еще, как минимум, отступы и сетка... Как получить их размер...


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Igors от Ноябрь 02, 2009, 14:24
Цель получить QTableWidget у которого никогда не появятся scrollBar'ы. Для этого надо задать minimumSize для QTableWidget. Чтобы его задать его надо посчитать...
Наверное Вы имеете ввиду только горизонтальный скроллер. Подсчет всех размеров хорошего впечатления не производит: например появится еще один лайаут - и опять пересчитывать. Не удастся ли проскочить с sizeHint, которое (вроде бы) должно возвращать оптимальный размер? Во всяком случае интересно проверить.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Павел_F. от Ноябрь 02, 2009, 14:34
Я имею ввиду оба. Мне не надо ни вертикального ни горизонтального, хотя подсчет размера одинаков у обоих.
Или я что-то не понимаю, или sizeHint мне никак не поможет, как его использовать чтоб он помог?
К первоначальному варианту добавил:
Код:
Size.setWidth( Size.width() + 2*Table->frameWidth());
Size.setHeight( Size.height() + 2*Table->frameWidth());
Но пока все равно со scrollBar'ами появляется.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: BRE от Ноябрь 02, 2009, 14:36
Может лучше не размер виджета подгонять под контекст, а контекст подогнать под размер виджета.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: BRE от Ноябрь 02, 2009, 14:43
Да я бы с радостью... Но как. Если есть варианты то рассмотрю, может подойдет.
При изменении размера QTableWidget, пробежаться по всем столбцам и установить их новые размеры так, чтобы они все поместились.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Павел_F. от Ноябрь 02, 2009, 14:45
При изменении размера QTableWidget, пробежаться по всем столбцам и установить их новые размеры так, чтобы они все поместились.

Да он изначально появляется такого размера что в него вообще ничего не помещается. Все лайаутом делаю... он решил что табличка нужна маленькая. Значит минимальный размер задать надо... Не от балды же его придумывать, не хорошо.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: BRE от Ноябрь 02, 2009, 14:51
Да он изначально появляется такого размера что в него вообще ничего не помещается. Все лайаутом делаю... он решил что табличка нужна маленькая. Значит минимальный размер задать надо... Не от балды же его придумывать, не хорошо.
layout решает не просто так, а на основании QSizePolicy::Policy.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Павел_F. от Ноябрь 02, 2009, 15:02
Изначально не задавал. Сейчас попробовал задавать setSizePolicy(). Перебрал все варианты... Разница между ними, конечно же, есть. Но скролбары везде есть и нужного результата я не получил.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: BRE от Ноябрь 02, 2009, 15:06
Изначально не задавал. Сейчас попробовал задавать setSizePolicy(). Перебрал все варианты... Разница между ними, конечно же, есть. Но скролбары везде есть и нужного результата я не получил.
Мы говорим про компоновщик на диалоге. Этот компоновщик учитывая политики всех виджетов автоматически подберет оптимальные для них размеры. Используя этот размер, тебе нужно рассчитать ширину всех столбцов, что бы они поместились в таблицу.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Igors от Ноябрь 02, 2009, 15:14
Определитесь что Вы хотите. "Чтобы все вмещалось без скроллбаров" - ну а если у Вас 1000 строк или в 1 колонке строка из 1000 символов - что тогда без них делать ? То есть Вам нужен размер для каких-то типовых данных в Вашей таблице - ну и зарядите их а потом возьмите sizeHint. Еще 1 простой вариант: нарисуйте это все в дизайере, там подгоните как надо и возьмите оттуда нужные размеры.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Павел_F. от Ноябрь 02, 2009, 16:02
Определитесь что Вы хотите. "Чтобы все вмещалось без скроллбаров" - ну а если у Вас 1000 строк или в 1 колонке строка из 1000 символов - что тогда без них делать ?
Ладно. Давайте говорить только про ширину и соответственно отсутствие горозонтального скролбара.
То есть Вам нужен размер для каких-то типовых данных в Вашей таблице - ну и зарядите их а потом возьмите sizeHint.
Этот sizeHint получается таким что текст в заголовке таблицы не влазиет да и вообще не все колонки убираются. Выставить политику так чтобы не появилось скрола у меня не получилось, перепробовал все. Вот и хочу теперь считать размер и задавать минимальный сам.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Павел_F. от Ноябрь 02, 2009, 16:20
Даже вот так.
Есть код:
Код:
  Table = new QTableWidget( this);
  QStringList HorLabels, VerLabels;
  HorLabels << tr("Первый столбец") << tr("Второй столбец") << tr("Третий столбец") << tr("Четвертый столбец") << tr("Пятый столбец");
  VerLabels << tr("Первая строка") << tr("Вторая строка") << tr("Третья строка") << tr("Четвертая строка") << tr("Пятая строка") << tr("Шестая строка");
  Table->setRowCount( VerLabels.count());
  Table->setColumnCount( HorLabels.count());
  Table->setHorizontalHeaderLabels ( HorLabels);
  Table->setVerticalHeaderLabels ( VerLabels);
  Table->resizeColumnsToContents();
  Table->resizeRowsToContents();
И очень хочется чтобы эта таблица появилась без скролов. Как решить эту проблему?


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: romank от Ноябрь 02, 2009, 19:50
мб эта?

http://www.prog.org.ru/topic_10909_0.html


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Павел_F. от Ноябрь 03, 2009, 07:46
Нет, не то.
Во вложении демонстрирую скрины:
Stretch - Это если к указанному коду добавить
Код:
Table->verticalHeader()->setResizeMode( QHeaderView::Stretch);
  Table->horizontalHeader()->setResizeMode( QHeaderView::Stretch);
ResizeToContents - Если не QHeaderView::Stretch а QHeaderView::ResizeToContents.
Оба флага работают, но хочется другого...


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Igors от Ноябрь 03, 2009, 12:32
Поэксперименитровал, приаттачил свой вариант. Мда, от sizeHint() толку как от быка молока  :'(
Приходится уныло вычислять руками, ничего лучшего не нашел


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Павел_F. от Ноябрь 03, 2009, 13:20
Мда, от sizeHint() толку как от быка молока  :'(
Приходится уныло вычислять руками, ничего лучшего не нашел
Спасибо. Сам уже смастерил. Мой код выглядит примерно также. Только я не ширину заголовков беру а каждую колонку считаю. Хотя ваш вариант вроде как лучше. Хотя headV->setResizeMode(QHeaderView::Stretch); я добавил.


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Igors от Ноябрь 03, 2009, 13:35
Было бы очень хорошо если бы sizeHint() работала как указано в документации: возвращала рекомендуемый размер, пусть даже только при наличии лайаута. Однако ж этого нет - и приходится делать массу лишних движений  :'(


Название: Re: Снова про QTableWidget. Как подогнать под содержимое.
Отправлено: Павел_F. от Ноябрь 03, 2009, 14:00
Есть даже maximumViewportSize().
QSize QAbstractScrollArea::maximumViewportSize () const
Returns the size of the viewport as if the scroll bars had no valid scrolling range.
Насколько позволяет знание языка она должна вернуть нужный размер. И без всяких layout'тов. Но, к сожалению, она тоже не дает нужного результата.