Qt: как предотвратить получение некоторыми виджетами полос прокрутки

#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.