Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: PavelVX от Сентябрь 21, 2012, 06:54



Название: Как уменьшить Layout после удаления из него виджета
Отправлено: 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 динамически добавляю/удаляю кнопки. При добавлении кнопок, виджет растет в высоту, как и надо. Но при удалении не стягивается. Уже крутил, вертел, не хочет уменьшаться. Подскажите, как его уменьшать-то?


Название: 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--) {
        tstBtn = qobject_cast< advQPushButton* >(btnVBoxLayout->itemAt(i)->widget());
        btnVBoxLayout->removeWidget(tstBtn);
        delete tstBtn;
    }
    this->adjustSize();
    qDebug() << "resize!";
Если вызывать этот код через слот нажатия кнопки на этом же виджете, то все сжимает, если через слот, сигнал на который приходит из другого класса, то ничего не сжимает, хотя, судя по надписи из qDebug() код проходит.
При этом выловлена закономерность: если по данному виджету, он показывется отдельным, ОлвейсОнТоп, элементом, щелкнуть, т.е. дать фокус, а потом вернуться к основному окну, то при следующем изменении размеров, все сработает как надо, но только один раз. Потом опять не будет ничего меняться.
Как такое может быть?


Название: 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, что в принципе полностью соответствует коду.