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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Снова про QTableWidget. Как подогнать под содержимое.  (Прочитано 21312 раз)
Павел_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());
Но этого не хватает. Кроме заголовков, колонок и строк есть еще, как минимум, отступы и сетка... Как получить их размер...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Ноябрь 02, 2009, 14:24 »

Цель получить QTableWidget у которого никогда не появятся scrollBar'ы. Для этого надо задать minimumSize для QTableWidget. Чтобы его задать его надо посчитать...
Наверное Вы имеете ввиду только горизонтальный скроллер. Подсчет всех размеров хорошего впечатления не производит: например появится еще один лайаут - и опять пересчитывать. Не удастся ли проскочить с sizeHint, которое (вроде бы) должно возвращать оптимальный размер? Во всяком случае интересно проверить.
Записан
Павел_F.
Гость
« Ответ #2 : Ноябрь 02, 2009, 14:34 »

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

Может лучше не размер виджета подгонять под контекст, а контекст подогнать под размер виджета.
Записан
BRE
Гость
« Ответ #4 : Ноябрь 02, 2009, 14:43 »

Да я бы с радостью... Но как. Если есть варианты то рассмотрю, может подойдет.
При изменении размера QTableWidget, пробежаться по всем столбцам и установить их новые размеры так, чтобы они все поместились.
Записан
Павел_F.
Гость
« Ответ #5 : Ноябрь 02, 2009, 14:45 »

При изменении размера QTableWidget, пробежаться по всем столбцам и установить их новые размеры так, чтобы они все поместились.

Да он изначально появляется такого размера что в него вообще ничего не помещается. Все лайаутом делаю... он решил что табличка нужна маленькая. Значит минимальный размер задать надо... Не от балды же его придумывать, не хорошо.
« Последнее редактирование: Ноябрь 02, 2009, 14:46 от Павел_F. » Записан
BRE
Гость
« Ответ #6 : Ноябрь 02, 2009, 14:51 »

Да он изначально появляется такого размера что в него вообще ничего не помещается. Все лайаутом делаю... он решил что табличка нужна маленькая. Значит минимальный размер задать надо... Не от балды же его придумывать, не хорошо.
layout решает не просто так, а на основании QSizePolicy::Policy.
Записан
Павел_F.
Гость
« Ответ #7 : Ноябрь 02, 2009, 15:02 »

Изначально не задавал. Сейчас попробовал задавать setSizePolicy(). Перебрал все варианты... Разница между ними, конечно же, есть. Но скролбары везде есть и нужного результата я не получил.
Записан
BRE
Гость
« Ответ #8 : Ноябрь 02, 2009, 15:06 »

Изначально не задавал. Сейчас попробовал задавать setSizePolicy(). Перебрал все варианты... Разница между ними, конечно же, есть. Но скролбары везде есть и нужного результата я не получил.
Мы говорим про компоновщик на диалоге. Этот компоновщик учитывая политики всех виджетов автоматически подберет оптимальные для них размеры. Используя этот размер, тебе нужно рассчитать ширину всех столбцов, что бы они поместились в таблицу.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Ноябрь 02, 2009, 15:14 »

Определитесь что Вы хотите. "Чтобы все вмещалось без скроллбаров" - ну а если у Вас 1000 строк или в 1 колонке строка из 1000 символов - что тогда без них делать ? То есть Вам нужен размер для каких-то типовых данных в Вашей таблице - ну и зарядите их а потом возьмите sizeHint. Еще 1 простой вариант: нарисуйте это все в дизайере, там подгоните как надо и возьмите оттуда нужные размеры.
Записан
Павел_F.
Гость
« Ответ #10 : Ноябрь 02, 2009, 16:02 »

Определитесь что Вы хотите. "Чтобы все вмещалось без скроллбаров" - ну а если у Вас 1000 строк или в 1 колонке строка из 1000 символов - что тогда без них делать ?
Ладно. Давайте говорить только про ширину и соответственно отсутствие горозонтального скролбара.
То есть Вам нужен размер для каких-то типовых данных в Вашей таблице - ну и зарядите их а потом возьмите sizeHint.
Этот sizeHint получается таким что текст в заголовке таблицы не влазиет да и вообще не все колонки убираются. Выставить политику так чтобы не появилось скрола у меня не получилось, перепробовал все. Вот и хочу теперь считать размер и задавать минимальный сам.
Записан
Павел_F.
Гость
« Ответ #11 : Ноябрь 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();
И очень хочется чтобы эта таблица появилась без скролов. Как решить эту проблему?
Записан
romank
Гость
« Ответ #12 : Ноябрь 02, 2009, 19:50 »

мб эта?

http://www.prog.org.ru/topic_10909_0.html
Записан
Павел_F.
Гость
« Ответ #13 : Ноябрь 03, 2009, 07:46 »

Нет, не то.
Во вложении демонстрирую скрины:
Stretch - Это если к указанному коду добавить
Код:
Table->verticalHeader()->setResizeMode( QHeaderView::Stretch);
  Table->horizontalHeader()->setResizeMode( QHeaderView::Stretch);
ResizeToContents - Если не QHeaderView::Stretch а QHeaderView::ResizeToContents.
Оба флага работают, но хочется другого...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Ноябрь 03, 2009, 12:32 »

Поэксперименитровал, приаттачил свой вариант. Мда, от sizeHint() толку как от быка молока  Плачущий
Приходится уныло вычислять руками, ничего лучшего не нашел
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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