#qt #layout
#qt #макет
Вопрос:
У меня есть следующий макет виджета:
HBox
- VBox
- HBox
widget "A"
widget "B"
- widget "C"
- widget "D"
Другими словами, у меня есть что-то вроде этого:
----- --------------
| A | |
----- C |
| B | |
----- --------------
| D |
--------------------
В зависимости от содержимого, «A» и «B» должны расширяться и занимать столько вертикального пространства, сколько необходимо, без отображения каких-либо полос прокрутки. «D» может сжиматься по мере необходимости.
Я попытался установить sizePolicy() для «A» и «B» как «Минимальные» и реализовал sizeHint() для «A» и «B» в зависимости от того, что они отображают. Тем не менее, я все еще вижу полосы прокрутки в «A» и «B», в то время как в «D» больше места, чем нужно.
Я также попробовал «Минимальное расширение» для sizePolicy(), но я все еще продолжаю видеть полосы прокрутки.
Как мне убедиться, что при наличии свободного места «A» и «B» получают преимущественное отношение, чтобы избежать полос прокрутки?
Ответ №1:
Используйте политику размера Expanding
as для A
и B
. Для виджета ‘D’ вы должны изменять его размер каждый раз, когда изменяется содержимое A
и / или B
. Политика размера должна быть минимальной, и вы должны использовать setMinimumHeight
.
Если у виджета есть полосы прокрутки, то он должен наследоваться от QAbstractScrollArea
. Вы могли бы использовать setHorizontalScrollBarPolicy
и setVerticalScrollBarPolicy
для отключения полос прокрутки:
A->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
B->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Комментарии:
1. Кажется каким-то неправильным устанавливать размер «D» при изменении размера «A» и / или «B». Это приводит к ненужной зависимости между «A» и «D». Если я позже сменю «D» на какой-нибудь другой виджет, мне придется модифицировать код. Тем не менее, я попробую. Было бы неплохо, если бы я мог просто установить политику размера для A / B.
Ответ №2:
Вы можете установить для minimumHeight
и minimumWidth
свойств A и B минимально возможное значение там, где нет полос прокрутки. Они по-прежнему смогут расширяться, но не будут сжиматься ниже этого размера.
[Редактировать:] После повторного прочтения вашего вопроса я понял, что содержимое A и B не всегда имеет одинаковый размер. Очевидно, что описанный выше подход был бы возможен только в том случае, если вы знаете размер содержимого всякий раз, когда оно меняется. В этом случае вы можете просто вызвать setMinimumHeight()
/ setMinimumWidth()
или одинаково setMinimumSize()
из своего кода.
Комментарии:
1. Я попробовал почти в точности то, что вы предложили, т. Е. после того, как я выясню, какая требуется высота, установите ее как минимальную высоту. Однако, похоже, это просто не работает. Я попытаюсь посмотреть, смогу ли я привести минимальный пример и опубликовать его здесь.
2. Я обнаружил проблему, когда пытался собрать минимальный пример. Оказывается, был виджет (глубоко внутри «D»), который сам устанавливал свой собственный minimumHeight.