Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Март 23, 2014, 11:29



Название: Добавление в layout
Отправлено: Igors от Март 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;
}
 


Название: Re: Добавление в layout
Отправлено: Kolobok от Март 23, 2014, 13:26
widget нужно положить в layout dlg'a

Код:
QVBoxLayout * parentLayout = new QVBoxLayout(dlg);
parentLayout->addWidget(widget);
parentLayout->addStretch();


Название: Re: Добавление в layout
Отправлено: Swa от Март 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();
}


Название: Re: Добавление в layout
Отправлено: Igors от Апрель 07, 2014, 10:54
Через неск дней опять понадобился sizeHint, но для всего окна. Здесь предыдущие 2 метода не срабатывают (хз почему), но нашелся третий: для лайаута окна сделать removeWidget и insertWidget (на то же место). После этого sizeHint оживает  :)

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

Edit: аккуратнее так
Код
C++ (Qt)
this->layout()->invalidate();
qApp()->sendPostedEvents();
qDebug() << this->sizeHint(); // пересчитанный размер