Russian Qt Forum
Июня 21, 2025, 22:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как уменьшить Layout после удаления из него виджета  (Прочитано 4700 раз)
PavelVX
Гость
« : Сентября 21, 2012, 06:54 »

Есть виджет с такой компановкой:
Код:
Код:
    
//btnVBoxLayout - глобальная переменная, тип QVBoxLayout
    QVBoxLayout * mainVBoxLayout = new QVBoxLayout();
    QLabel * tstLabel = new QLabel("Тут могла быть ваша реклама :)", this);
    mainVBoxLayout->addWidget(tstLabel);
    mainVBoxLayout->addLayout(btnVBoxLayout);
    QHBoxLayout * bottomHBoxLayout = new QHBoxLayout();
    bottomHBoxLayout->addWidget(btnBack);
    bottomHBoxLayout->addWidget(btnRefresh);
    mainVBoxLayout->addLayout(bottomHBoxLayout);
    setLayout(mainVBoxLayout);
В btnVBoxLayout динамически добавляю/удаляю кнопки. При добавлении кнопок, виджет растет в высоту, как и надо. Но при удалении не стягивается. Уже крутил, вертел, не хочет уменьшаться. Подскажите, как его уменьшать-то?
Записан
porup
Гость
« Ответ #1 : Сентября 21, 2012, 07:27 »

void QWidget::adjustSize();
Записан
trot
Гость
« Ответ #2 : Сентября 21, 2012, 07:46 »

Поставить распорку или пружинку.
Записан
PavelVX
Гость
« Ответ #3 : Сентября 21, 2012, 08:29 »

porup, спасибо, сработало!
trot, пружинка выполняет немного не эти задачи, она прижимает контролы куда надо. но спасибо, что напомнили! Улыбающийся
Записан
PavelVX
Гость
« Ответ #4 : Сентября 24, 2012, 09:41 »

Что-то фантастическое происходит.
Код:
    for (int i = btnVBoxLayout->count()-1; i>=0; i--) {
        tstBtn = qobject_cast< advQPushButton* >(btnVBoxLayout->itemAt(i)->widget());
        btnVBoxLayout->removeWidget(tstBtn);
        delete tstBtn;
    }
    this->adjustSize();
    qDebug() << "resize!";
Если вызывать этот код через слот нажатия кнопки на этом же виджете, то все сжимает, если через слот, сигнал на который приходит из другого класса, то ничего не сжимает, хотя, судя по надписи из qDebug() код проходит.
При этом выловлена закономерность: если по данному виджету, он показывется отдельным, ОлвейсОнТоп, элементом, щелкнуть, т.е. дать фокус, а потом вернуться к основному окну, то при следующем изменении размеров, все сработает как надо, но только один раз. Потом опять не будет ничего меняться.
Как такое может быть?
« Последнее редактирование: Сентября 24, 2012, 09:45 от PavelVX » Записан
Bepec
Гость
« Ответ #5 : Сентября 24, 2012, 09:57 »

Вруби перед
Код:
adjustSize()
 
Код:
qApp->processEvents()
Авось поможет.
Записан
PavelVX
Гость
« Ответ #6 : Сентября 24, 2012, 10:27 »

Спасибо, помогло. Но хотелось бы еще и понять, почему так происходит?
Записан
Bepec
Гость
« Ответ #7 : Сентября 24, 2012, 10:32 »

Вкратце - удаление объекта как задача помещается в очередь событий приложения(EventLoop).

Соответственно если в следующей строке вызвать adjustSize, то его поведение неопределённое(не в том ужасном смысле как у Страуструпа, но всё же неприятно).

AdjustSize может быть выполнен как до удаления так и после(% в 98 он выполняется до). Соответственно размеры расчитаны с неудалённым виджетом.

Вызов processEvents() заставляет приложение выполнить ожидающие события. Т.е. удаляется твой объект с формы. И adjustSize() прорабатывает размеры уже без учёта удалённого виджета.

PS как то так. К сожалению в тонких материях я путаюсь Улыбающийся
Записан
PavelVX
Гость
« Ответ #8 : Сентября 24, 2012, 10:40 »

да и на этом большое спасибо. Только вот я тогда понять не могу, как влияет получение фокуса на обработку событий. Или у активного окна все делается в порядке очередности кода?
Записан
Bepec
Гость
« Ответ #9 : Сентября 24, 2012, 10:51 »

Пока у меня только одна мысль - вы попадаете таким извращённым способом на 2%, приведённых мной Веселый

PS незря ж я написал - неопределённое.

PPS скорее всего событие об удалении успевает проскочить перед adjust, что в принципе полностью соответствует коду.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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