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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Добавление в layout  (Прочитано 2732 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Март 23, 2014, 11:29 »

Добрый день

Создаю виджет, назначаю ему QVBoxLayout и начиняю его кнопками. Все гуд, виджет сайзится чтобы вписать содержимое (первый скриншот). Однако после show() так уже не выходит (второй скриншот). Мои потуги (sizePolicy, adjustSize, WA_Resized и.т.п.) ни к чему не повели. В чем секрет? Тестовый текст прилагаю.

Спасибо

Код
C++ (Qt)
#include <QtGui>
 
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
 
QDialog * dlg = new QDialog;
dlg->resize(800, 600);
 
QWidget * widget = new QWidget(dlg);
 
QLayout * layout = new QVBoxLayout(widget);
layout->addWidget(new QRadioButton("Button 1"));
layout->addWidget(new QRadioButton("Some Other"));
layout->addWidget(new QRadioButton("Button 2"));
layout->setSpacing(4);
 
widget->move(10, 10);
 
qDebug() << "geometry" << widget->geometry() << "hint" << widget->sizeHint();
dlg->show();
 
if (1) {
QRadioButton * btn = new QRadioButton("A longer button yet");
layout->addWidget(btn);
qDebug() << "geometry" << widget->geometry() << "hint" << widget->sizeHint();
}
 
app.exec();
 
return 0;
}
 
Записан
Kolobok
Гость
« Ответ #1 : Март 23, 2014, 13:26 »

widget нужно положить в layout dlg'a

Код:
QVBoxLayout * parentLayout = new QVBoxLayout(dlg);
parentLayout->addWidget(widget);
parentLayout->addStretch();
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #2 : Март 23, 2014, 13:29 »

Да, есть такое, непонятно, баг это или так задумано, я в документации ничего не нашел. Получается, для виджетов, которые сами не находятся в лэйауте, перерасчет размеров происходит во время вызова show().
Решения два:
1. Поместить виджет widget в лэйаут.
Код:
QVBoxLayout* l = new QVBoxLayout(dlg);
l->addWidget(widget);

2.
Код:
if (1) {
QRadioButton * btn = new QRadioButton("A longer button yet");
widget->hide();
layout->addWidget(btn);
widget->show();
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 07, 2014, 10:54 »

Через неск дней опять понадобился sizeHint, но для всего окна. Здесь предыдущие 2 метода не срабатывают (хз почему), но нашелся третий: для лайаута окна сделать removeWidget и insertWidget (на то же место). После этого sizeHint оживает  Улыбающийся

Спасибо ответившим

Edit: аккуратнее так
Код
C++ (Qt)
this->layout()->invalidate();
qApp()->sendPostedEvents();
qDebug() << this->sizeHint(); // пересчитанный размер
« Последнее редактирование: Апрель 07, 2014, 12:44 от Igors » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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