Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ogogon от Октябрь 17, 2021, 17:51



Название: Исчезающие виджеты или группы виджетов.
Отправлено: ogogon от Октябрь 17, 2021, 17:51
Коллеги, подскажите, пожалуйста, как сделать, чтобы виджет, или группа виджетов, могли появляться или исчезать в окне?

Предположим, что у меня есть некое окно. Я схимичил его с любезной помощью Qt Designer'а. Оно более-менее корректно сверстано, расперто пружинками, при изменении размеров ведет себя вполне прилично.

Однако, возникает ситуация, когда выясняется, что некие условия изменились и в окне нужны еще несколько элементов. Или наоборот, в них пропала надобность.

Сейчас у меня эти элементы все равно есть, но я с помощью метода setEnabled() или оживляю их или делаю серыми и потухшими.

А можно ли устроить так, чтобы они вообще полностью исчезали, или наоборот - волшебно появлялись. (Ну, а за счет компоновщика, окно подправляло свой вид.)

Признателен за совет,
Ogogon.


Название: Re: Исчезающие виджеты или группы виджетов.
Отправлено: Mikhail от Октябрь 17, 2021, 19:12
Есть магическая hide()


Название: Re: Исчезающие виджеты или группы виджетов.
Отправлено: tux от Октябрь 17, 2021, 19:13
 void setVisible(bool visible)


Название: Re: Исчезающие виджеты или группы виджетов.
Отправлено: ogogon от Октябрь 18, 2021, 19:53
Благодарю. Основная часть задачи у меня вполне решилась, но остались шероховатости, мелкие, однако неприятные.

Все виджеты, которым я в теле конструктора класса MainWindow сказал hide() - исправно дематериализовались, а после того, как используя одну еще не задействованную кнопку сказал им же setVisible(true) - так же дисциплинированно материализовались обратно.

Но, при этом, выявилась неприятная проблема с подгонкой размеров окна. После дематериализации виджетов, окно MainWindow имеет те же размеры, что и с видимыми виджетами, но образовавшееся пустое место более-менее справедливо распределено между вертикальными пружинками в компоновке окна. Если окно вручную, захватив нижнюю грань мышкой, уменьшить по вертикали, то оно принимает правильные размеры, однако автоматически этого делать не хочет.
Сжатое таким манером окно, после setVisible(true), прекрасно ремасштабируется до нужной компоновки, с учетом "проявившихся" виджетов.

Я честно пытался уговорить окно ужаться по вертикали. После hide() я говорил ему
Код:
this->resize(minimumSize());
еще
Код:
this->resize(minimumSizeHint());
после них (и без них)
Код:
this->adjustSize();
Даже получил высоту общего контейнера с "исчезнувшими" виджетами и вычел ее из общей высоты окна.
Код:
this->resize(this->size().width(), this->size().height() - ui->verticalLayoutInvisible->geometry().size().height());
Ни в какую!

Как мне уговорить окно MainWindow самостоятельно сделать то, что я делаю мышкой - уменьшить высоту до минимально возможной, с учетом видимых элементов?
 
Ogogon.


Название: Re: Исчезающие виджеты или группы виджетов.
Отправлено: Racheengel от Ноябрь 05, 2021, 14:11
ИМХО старый баг Qt - когда прячем виджеты, размеры контейнера не меняются.
Вообще ручной вызов adjustSize(); должен бы помочь.
Но если нет, можно попробовать вызвать setFixedSize() с нужной высотой.


Название: Re: Исчезающие виджеты или группы виджетов.
Отправлено: tux от Ноябрь 05, 2021, 15:37
ИМХО старый баг Qt - когда прячем виджеты, размеры контейнера не меняются.
Вряд ли они это считают багом - ведь сами виджеты никуда не деваются, они просто для вас невидимы. Там ведь есть ещё одна проблема - если невидимый виджет сам изменит свои размеры - что делать родителю?
Хотя, что-то типа флага - "изменять размеры родительского виджета при изменении видимости детей" не помешало бы.


Название: Re: Исчезающие виджеты или группы виджетов.
Отправлено: Racheengel от Ноябрь 08, 2021, 15:59
Вряд ли они это считают багом - ведь сами виджеты никуда не деваются, они просто для вас невидимы.

Невидимы, значит, их нет - я то откуда знаю, что они скрыты)

Там ведь есть ещё одна проблема - если невидимый виджет сам изменит свои размеры - что делать родителю?

Та какая ж это проблема. Пока он не видим - ничего и не делать. Вот как покажется - тогда согласно политики.


Название: Re: Исчезающие виджеты или группы виджетов.
Отправлено: tux от Ноябрь 09, 2021, 20:33
Так предложите своё, корректное решение данной проблемы, если вы считаете, что это баг. Если решение будет корректным - можно и патч организовать. Только нужно, чтобы оно во всех системах работало. А их 3, не считая микроконтроллеров...


Название: Re: Исчезающие виджеты или группы виджетов.
Отправлено: juvf от Ноябрь 11, 2021, 09:32
ИМХО старый баг Qt - когда прячем виджеты, размеры контейнера не меняются.
это не баг. почему размеры контейнера должны меняться? Мне надо скрыть виджеты - с какого перепугу нужно менять контейнер? Если нужно и контейнер изменить - я его изменю.

На сколько я понял - нужно сделать окно с дополнительной секцией и скрывать/показывать её. Что-то типа кнопки "дополнительно" или "детали" во всяких визардах/прогрессбарах.
Это делается в Qt. Вроде даже в примерах есть. Я такое делал когда-то.

ps не могу пример найти. накидал навскидку холоворд - это оно? Может кто более изящный способ предложит.