Подтвердить что ты не робот

Скрытие виджета Qt и сохранение пространства виджетов

В простой форме я сделал несколько кнопок и разместил горизонтальную компоновку. Когда мышь покидает область, одна из кнопок, последняя, ​​должна быть скрыта. С помощью button- > hide() он работает, но все кнопки перегруппированы менеджером компоновки. Я хочу, чтобы все остальные кнопки продолжали оставаться на своих позициях. Я попытался заменить виджет на место владельца виджета и заменить кнопку и placeholder hide()/show(), вызывая placeholder- > resize (button- > size()), но диспетчер компоновки не учитывает изменение размера и Заполнитель задается с минимальным размером. Каков наилучший способ удалить виджет и сохранить его пространство?

4b9b3361

Ответ 1

Попробуйте встроить свой виджет в QStackWidget с двумя страницами: * Ваш виджет на одной странице * еще одна пустая страница

Установите текущую страницу qstackwidget на пустую страницу, если вы хотите скрыть свой виджет. И верните его на главную страницу, чтобы отобразить виджет (ы).

Ответ 3

У меня была такая же проблема.

В итоге я добавил HorizontalSpacer (мой макет был горизонтальным), который я изначально задал для политики размера 0 и размера. Затем я использовал:

if (button_is_shown)
  ui.horizontalSpacer->changeSize(0,0, QSizePolicy::Fixed, QSizePolicy::Fixed);
else
  ui.horizontalSpacer->changeSize(1,1, QSizePolicy::Expanding, QSizePolicy::Fixed);

Чтобы заполнить пробел. Аналогично, вы можете изменить размер проставки до размера кнопки и сохранить ее как Fixed QSizePolicy.

Ответ 4

Вы можете попробовать поместить кнопку в скрытое место внутри другого виджета и попытаться заставить другой виджет правильно держать свой размер, когда кнопка скрыта. Это может быть немного сложно. Был предложен QStackedWidget, и, возможно, это будет способ... он будет похож на оболочку QWidget, за исключением того, что размер может быть проще.

Другим вариантом, на который вы можете обратить внимание, является вставка проставки для заполнителя и установка проставки на фиксированный размер, который является размером кнопки. (При изменении размера кнопки вам необходимо обновить размер). Вы должны быть в состоянии показать/скрыть их попарно и заставить работать, как вы ожидаете.

Ответ 5

Я бы также попытался установить фильтр событий, который переопределяет исходное событие рисования, рисует прозрачный фон и игнорирует большинство событий, на которые не должен реагировать виджет, когда он невидим (возможно, все из них, кроме QResizeEvent), Когда виджет снова станет видимым, удалите фильтр событий.

См. QObject::installEventFilter(QObject*) и QObject::removeEventFilter(QObject*).

Ответ 6

Попробуйте поместить кнопку, которую вы хотите скрыть и отобразить в другом макете. В этом макете вместе с кнопкой помещается проставка. Кнопка "Скрыть" и "Спейсер" будет захвачена. Spacer захватывает скрытое пространство кнопок. Другие кнопки продолжают занимать одинаковое пространство.

Ответ 7

Простой способ сделать это - установить размер miminum виджета владельца места вместо того, чтобы изменять его размер. Хотя размер виджета не соблюдается макетами, минимальный размер.

Ответ 8

Вероятно, самый простой способ сделать это - установить максимальный размер кнопок на подсказку их размера.

button->setMaximumSize(button->sizeHint());

Это должно держать видимые кнопки одинакового размера и не заставлять их расширяться, когда другой скрыт. Вам нужно будет позаботиться о том, чтобы, если вы изменили текст на кнопках, вы reset их максимальный размер, но вы, вероятно, сделаете это только в одном месте. Я считаю, что что-то подобное было сделано в одной из ранних глав книги Qt (но у меня ее нет впереди, поэтому я не могу указать вам нужное место).

Ответ 9

Я не знаю, если это лучший способ, но решил это с помощью QStackedWidget, чтобы обернуть кнопку.