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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QLayout, или "Где я не прав"?  (Прочитано 11014 раз)
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 правильно определен и не нулевой.

Спасибо Улыбающийся
Записан
¤Se®ega¤
Гость
« Ответ #1 : Апрель 17, 2009, 01:01 »

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Апрель 17, 2009, 06:21 »

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Danila_Bagrofff
Гость
« Ответ #3 : Апрель 17, 2009, 07:08 »

задай виджетам setMinimumSize а  так же SizePolicy.
Записан
Nemaefar
Гость
« Ответ #4 : Апрель 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));
Записан
¤Se®ega¤
Гость
« Ответ #5 : Апрель 17, 2009, 12:00 »

а попробуй после каждого добавления сделать viewer->adjustSize();
Записан
Nemaefar
Гость
« Ответ #6 : Апрель 17, 2009, 12:18 »

а попробуй после каждого добавления сделать viewer->adjustSize();

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

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Апрель 17, 2009, 12:35 »

А если после добавления вызывать mainLayout->invalidate() \ mainLayout->update() \ mainLayout->activate() или viewer->updateGeometry()
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Nemaefar
Гость
« Ответ #8 : Апрель 17, 2009, 13:05 »

А если после добавления вызывать mainLayout->invalidate() \ mainLayout->update() \ mainLayout->activate() или viewer->updateGeometry()

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

PS. В аттаче полная тестовая прога (минимум, нужный для вызова бага). Ну, это если вдруг кто заинтересуется Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Апрель 17, 2009, 13:08 »

Кстате, а версия Qt какая?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Nemaefar
Гость
« Ответ #10 : Апрель 17, 2009, 13:11 »

Qt SDK 1.00
(qt-sdk-win-opensource-2009.01.1.exe)
Qt 4.5.0
Записан
Jokerochek
Гость
« Ответ #11 : Апрель 17, 2009, 13:23 »

Когда я разбирал пример с ExtensionWidget у меня была похожая проблема. Виджет, который был скрытым в пределах основного layout'а, на нем был свой layout, но он не был привязан к виджету (делал форму в дизайнере..и не стал указывать размещение у второго виджета). И при добавлении удалении дополнтельных элементов отрисовка происходила плохо.
Как только указал во втором виджете размещение - все заработало правильно
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Апрель 17, 2009, 16:53 »

У меня эта вещь проявлялась со скрываемым виджетом, при его появлении окно расширялось(что действительно нужно), а при исчезании так и оставалось. Помогло мне
qApp->processEvents();
dialog->resize(0,0);
Но происходит видимое мерцание диалога.
Интересно, на зарубежных форумах этот вопрос поднимали?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #13 : Апрель 17, 2009, 16:56 »

Как вариант, напишите баг репорт и приаттачьте минимальный пример для воспроизведения
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Апрель 17, 2009, 16:58 »

I'm very bad speak English. Грустный
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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