Название: QLayout, или "Где я не прав"? Отправлено: Nemaefar от Апрель 17, 2009, 00:18 Имеется виджет, не подчиненный лейаутам. На нем создан лейаут mainLayout. И на него уже помещаются динамически некоторые объекты. Почему-то первый раз, когда помещаю объекты (сколько угодно) - они красивенько ложатся. А вот при втором вызове - размер виждета не изменяется (ну и получаем сжатые донельзя объекты). Но при третьем вызове - размер меняется до уровня второго (но все равно получаем сжатые объекты - так как добавились новые).
Почему так происходит? Код Ps. Если выводить 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. Получается не лучше =) (см. скрин) Код
Название: Re: QLayout, или "Где я не прав"? Отправлено: ¤Se®ega¤ от Апрель 17, 2009, 12:00 а попробуй после каждого добавления сделать viewer->adjustSize();
Название: Re: QLayout, или "Где я не прав"? Отправлено: Nemaefar от Апрель 17, 2009, 12:18 а попробуй после каждого добавления сделать viewer->adjustSize(); Я так понял, оно делает тоже самое, что и Код Никакого эффекта :( Похоже, действительно, бага. Название: 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 кривовато прикручен, в самое нутро пролезть не дает. Я пытался лазить, чтобы понять, где там не идет присвоения, но без отладчика это сложно мягко говоря. Ладно, может, в следущих версиях поправят. Пока что пользуюсь Код
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? и ось какая? А хотя нет, если раз сто нажать на эту кнопку тогда реально баг :( |