Название: Как уменьшить Layout после удаления из него виджета Отправлено: PavelVX от Сентябрь 21, 2012, 06:54 Есть виджет с такой компановкой:
Код: Код:
Название: Re: Как уменьшить Layout после удаления из него виджета Отправлено: porup от Сентябрь 21, 2012, 07:27 void QWidget::adjustSize();
Название: Re: Как уменьшить Layout после удаления из него виджета Отправлено: trot от Сентябрь 21, 2012, 07:46 Поставить распорку или пружинку.
Название: Re: Как уменьшить Layout после удаления из него виджета Отправлено: PavelVX от Сентябрь 21, 2012, 08:29 porup, спасибо, сработало!
trot, пружинка выполняет немного не эти задачи, она прижимает контролы куда надо. но спасибо, что напомнили! :) Название: Re: Как уменьшить Layout после удаления из него виджета Отправлено: PavelVX от Сентябрь 24, 2012, 09:41 Что-то фантастическое происходит.
Код: for (int i = btnVBoxLayout->count()-1; i>=0; i--) { При этом выловлена закономерность: если по данному виджету, он показывется отдельным, ОлвейсОнТоп, элементом, щелкнуть, т.е. дать фокус, а потом вернуться к основному окну, то при следующем изменении размеров, все сработает как надо, но только один раз. Потом опять не будет ничего меняться. Как такое может быть? Название: Re: Как уменьшить Layout после удаления из него виджета Отправлено: Bepec от Сентябрь 24, 2012, 09:57 Вруби перед
Код: adjustSize() Код: qApp->processEvents() Название: Re: Как уменьшить Layout после удаления из него виджета Отправлено: PavelVX от Сентябрь 24, 2012, 10:27 Спасибо, помогло. Но хотелось бы еще и понять, почему так происходит?
Название: Re: Как уменьшить Layout после удаления из него виджета Отправлено: Bepec от Сентябрь 24, 2012, 10:32 Вкратце - удаление объекта как задача помещается в очередь событий приложения(EventLoop).
Соответственно если в следующей строке вызвать adjustSize, то его поведение неопределённое(не в том ужасном смысле как у Страуструпа, но всё же неприятно). AdjustSize может быть выполнен как до удаления так и после(% в 98 он выполняется до). Соответственно размеры расчитаны с неудалённым виджетом. Вызов processEvents() заставляет приложение выполнить ожидающие события. Т.е. удаляется твой объект с формы. И adjustSize() прорабатывает размеры уже без учёта удалённого виджета. PS как то так. К сожалению в тонких материях я путаюсь :) Название: Re: Как уменьшить Layout после удаления из него виджета Отправлено: PavelVX от Сентябрь 24, 2012, 10:40 да и на этом большое спасибо. Только вот я тогда понять не могу, как влияет получение фокуса на обработку событий. Или у активного окна все делается в порядке очередности кода?
Название: Re: Как уменьшить Layout после удаления из него виджета Отправлено: Bepec от Сентябрь 24, 2012, 10:51 Пока у меня только одна мысль - вы попадаете таким извращённым способом на 2%, приведённых мной :D
PS незря ж я написал - неопределённое. PPS скорее всего событие об удалении успевает проскочить перед adjust, что в принципе полностью соответствует коду. |