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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как уменьшить Layout после удаления из него виджета  (Прочитано 4456 раз)
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.044 секунд. Запросов: 21.