Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Nemaefar от Апрель 17, 2009, 00:18



Название: QLayout, или "Где я не прав"?
Отправлено: Nemaefar от Апрель 17, 2009, 00:18
Имеется виджет, не подчиненный лейаутам. На нем создан лейаут mainLayout. И на него уже помещаются динамически некоторые объекты. Почему-то первый раз, когда помещаю объекты (сколько угодно) - они красивенько ложатся. А вот при втором вызове - размер виждета не изменяется (ну и получаем сжатые донельзя объекты). Но при третьем вызове - размер меняется до уровня второго (но все равно получаем сжатые объекты - так как добавились новые).
Почему так происходит?
Код
C++ (Qt)
//viewer->setLayout(mainLayout);
void MainWindow::regenField()
{
   switch (state)
   {
case 0:
{
   QPushButton *bt = new QPushButton("Confirm");
   connect(bt, SIGNAL(clicked()), this, SLOT(regenField()));
   mainLayout->addWidget(bt);
   state++;
}
break;
case 1:
{
   QPushButton *bt = new QPushButton("Confirm");
   connect(bt, SIGNAL(clicked()), this, SLOT(regenField()));
   mainLayout->addWidget(bt);
   state++;
}
break;
   }
   viewer->resize(mainLayout->sizeHint());
}
Ps.
Если выводить sizeHint-ы добавленных виджетов в форме
Код
C++ (Qt)
mainLayout->itemAt(i)->sizeHint()
выводится QSize(0,0)
хотя у самих виджетов sizeHint правильно определен и не нулевой.

Спасибо :)


Название: Re: QLayout, или "Где я не прав"?
Отправлено: ¤Se®ega¤ от Апрель 17, 2009, 01:01
Я думаю что когда ты первый раз добавляешь кнопку на виджет то все нормально, потом когда ты добавляешь второй раз, то ты именно добавляешь еще раз к тому что было, тоесть у тебя второй лайоут опять же добавляет кнопку уже к той кнопке, что етсь.


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Пантер от Апрель 17, 2009, 06:21
Самого бесит такое поведение. Временное решение, после добавления виджета в лайот вызывать  qApp->processEvents(); и следом ресайзить диалог.
Цитировать
Ps.
Если выводить sizeHint-ы добавленных виджетов в форме
Код
C++ (QT)
mainLayout->itemAt(i)->sizeHint()
выводится QSize(0,0)
хотя у самих виджетов sizeHint правильно определен и не нулевой.
А ты попробуй так:
1. Добавляешь виджет на лайот.
2. qApp->processEvents();
3. Выводишь sizeHint.


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Danila_Bagrofff от Апрель 17, 2009, 07:08
задай виджетам setMinimumSize а  так же SizePolicy.


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Nemaefar от Апрель 17, 2009, 08:24
Я думаю что когда ты первый раз добавляешь кнопку на виджет то все нормально, потом когда ты добавляешь второй раз, то ты именно добавляешь еще раз к тому что было, тоесть у тебя второй лайоут опять же добавляет кнопку уже к той кнопке, что етсь.

Ну так а третий раз тогда почему он ресайзит до уровня второго раза?

Самого бесит такое поведение. Временное решение, после добавления виджета в лайот вызывать  qApp->processMessages(); и следом ресайзить диалог.
Цитировать
Ps.
Если выводить sizeHint-ы добавленных виджетов в форме
Код
C++ (QT)
mainLayout->itemAt(i)->sizeHint()
выводится QSize(0,0)
хотя у самих виджетов sizeHint правильно определен и не нулевой.
А ты попробуй так:
1. Добавляешь виджет на лайот.
2. qApp->processMessages();
3. Выводишь sizeHint.

Ну если он не обрабатывает эвенты для лейаута по добавлении нового виджета, то это уже не фича, а бага получается?
Да, с qApp->processEvents(); все заработало, спасибо =) Буду пока что так использовать - так как небольшой костыль не очень критичен. Но все же интересно сделать красиво - а красиво не получается.

задай виджетам setMinimumSize а  так же SizePolicy.

Получается не лучше =) (см. скрин)
Код
C++ (Qt)
bt->setMinimumSize(QSize(100,50));


Название: Re: QLayout, или "Где я не прав"?
Отправлено: ¤Se®ega¤ от Апрель 17, 2009, 12:00
а попробуй после каждого добавления сделать viewer->adjustSize();


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Nemaefar от Апрель 17, 2009, 12:18
а попробуй после каждого добавления сделать viewer->adjustSize();

Я так понял, оно делает тоже самое, что и
Код
C++ (Qt)
viewer->resize(mainLayout->sizeHint());
Никакого эффекта :(
Похоже, действительно, бага.


Название: Re: QLayout, или "Где я не прав"?
Отправлено: pastor от Апрель 17, 2009, 12:35
А если после добавления вызывать mainLayout->invalidate() \ mainLayout->update() \ mainLayout->activate() или viewer->updateGeometry()


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Nemaefar от Апрель 17, 2009, 13:05
А если после добавления вызывать mainLayout->invalidate() \ mainLayout->update() \ mainLayout->activate() или viewer->updateGeometry()

Зеро эмоций... Так даже размер виджета остается дефолтным - поля*2 по ширине и высоте. и где-то там виден уголок кнопки :)
Жалко, gdb в Qt SDK кривовато прикручен, в самое нутро пролезть не дает. Я пытался лазить, чтобы понять, где там не идет присвоения, но без отладчика это сложно мягко говоря.
Ладно, может, в следущих версиях поправят. Пока что пользуюсь
Код
C++ (Qt)
qApp->processEvents();

PS. В аттаче полная тестовая прога (минимум, нужный для вызова бага). Ну, это если вдруг кто заинтересуется :)


Название: Re: QLayout, или "Где я не прав"?
Отправлено: pastor от Апрель 17, 2009, 13:08
Кстате, а версия Qt какая?


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Nemaefar от Апрель 17, 2009, 13:11
Qt SDK 1.00
(qt-sdk-win-opensource-2009.01.1.exe)
Qt 4.5.0


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Jokerochek от Апрель 17, 2009, 13:23
Когда я разбирал пример с ExtensionWidget у меня была похожая проблема. Виджет, который был скрытым в пределах основного layout'а, на нем был свой layout, но он не был привязан к виджету (делал форму в дизайнере..и не стал указывать размещение у второго виджета). И при добавлении удалении дополнтельных элементов отрисовка происходила плохо.
Как только указал во втором виджете размещение - все заработало правильно


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Пантер от Апрель 17, 2009, 16:53
У меня эта вещь проявлялась со скрываемым виджетом, при его появлении окно расширялось(что действительно нужно), а при исчезании так и оставалось. Помогло мне
qApp->processEvents();
dialog->resize(0,0);
Но происходит видимое мерцание диалога.
Интересно, на зарубежных форумах этот вопрос поднимали?


Название: Re: QLayout, или "Где я не прав"?
Отправлено: pastor от Апрель 17, 2009, 16:56
Как вариант, напишите баг репорт и приаттачьте минимальный пример для воспроизведения


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Пантер от Апрель 17, 2009, 16:58
I'm very bad speak English. :(


Название: Re: QLayout, или "Где я не прав"?
Отправлено: m_ax от Апрель 17, 2009, 22:12
Незнаю, может я не в теме, но у меня всё нормально  ::)
Правда, мне пришлось переопределить метод sizeHint и minimumSizeHint...
Проверено на Qt-4.4.3 и на Qt-4.5.0.
А не выложите ли вы полный код? 
Я сейчас постараюсь свой выложить  :)


Название: Re: QLayout, или "Где я не прав"?
Отправлено: m_ax от Апрель 17, 2009, 22:38
Вот выкладываю пример, где мне это приходилось использовать...
Тока не смейтесь  ;D вариант чертовски не допилинный но рабочий  ;)
в main.cpp закоментированны несколько строк, где в лайот добавляются вибжиты, как у вас...

Ну в общем разберётесь  ;)


Название: Re: QLayout, или "Где я не прав"?
Отправлено: Nemaefar от Апрель 18, 2009, 02:28
Вот немного подправил код, чтобы было видно, где этот глюк проявляется.
(Конечно, моя кнопка тут смотрится ну совсем не в тему, но я ее добавил в первое попавшееся место :) )

При нажатии на эту кнопку, страница добавляется. Однако, сам лейаут не ресайзится. И получются опять сжатые кнопки.

PS. Тоже хочу такие красивые кнопочки делать :-[


Название: Re: QLayout, или "Где я не прав"?
Отправлено: m_ax от Апрель 18, 2009, 12:12
Странно, у меня хоть убейте при добавлении страницы (add page) с кнопками ничего такого не происходит, что изображено у вас   ???
У вас какая версия Qt? и ось какая?

А хотя нет, если раз сто нажать на эту кнопку тогда реально баг  :(