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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Исчезающие виджеты или группы виджетов.  (Прочитано 4044 раз)
ogogon
Новичок

Offline Offline

Сообщений: 9



Просмотр профиля
« : Октябрь 17, 2021, 17:51 »

Коллеги, подскажите, пожалуйста, как сделать, чтобы виджет, или группа виджетов, могли появляться или исчезать в окне?

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

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

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

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

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

Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Октябрь 17, 2021, 19:12 »

Есть магическая hide()
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #2 : Октябрь 17, 2021, 19:13 »

 void setVisible(bool visible)
Записан

ogogon
Новичок

Offline Offline

Сообщений: 9



Просмотр профиля
« Ответ #3 : Октябрь 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.
« Последнее редактирование: Октябрь 21, 2021, 16:59 от ogogon » Записан

Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Ноябрь 05, 2021, 14:11 »

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #5 : Ноябрь 05, 2021, 15:37 »

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

Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Ноябрь 08, 2021, 15:59 »

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

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

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #7 : Ноябрь 09, 2021, 20:33 »

Так предложите своё, корректное решение данной проблемы, если вы считаете, что это баг. Если решение будет корректным - можно и патч организовать. Только нужно, чтобы оно во всех системах работало. А их 3, не считая микроконтроллеров...
Записан

juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #8 : Ноябрь 11, 2021, 09:32 »

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

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

ps не могу пример найти. накидал навскидку холоворд - это оно? Может кто более изящный способ предложит.
« Последнее редактирование: Ноябрь 11, 2021, 09:36 от juvf » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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