2015-05-16 4 views
1

У меня был настоящий вызов получить QScrollArea, чтобы взять минимальное возможное пространство до максимальной высоты.QScrollArea vertical sizePolicy - размер до максимальной высоты

Моя модель графического интерфейса выглядит следующим образом: A QScrollArea содержит вертикальную компоновку, которая заполнена виджетами класса TableRow. Я хочу, чтобы этот класс TableRow занимал минимальную возможную высоту. Он имеет вид сверху, который всегда виден, и QScrollArea, внизу которого есть ярлык внутри, чья видимость может быть переключена. Метка предназначена для заметок, которые могут быть 0 символов или могут быть бесконечными по длине (аппаратные ограничения в сторону).

Я обнаружил, что для метки в классе TableRow установки вертикальной sizePolicy к Fixed будет на самом деле взять, сколько это нужно уместить все содержимое (см: Qt Layout, resize to minimum after widget size changes). Однако, похоже, это не работает с QScrollArea. Фактически каждый sizePolicy, который я пробовал, держит QScrollArea на фиксированной высоте; за исключением Ignore, но затем QScrollArea переходит на высоту 0, независимо от его содержимого.

Я создал git branch, создав упрощенную версию этой проблемы.

Вот результат применения фиксированного вертикального sizePolicy: Result of fixed vertical sizePolicy

Что я ожидал от этого теста:

  • высота первого виджета должна быть почти 30px (высота из верхний виджет), только показывающий границы для QLabel и QScrollArea
  • Высота второго виджета должна быть короче 130 пикселей (максимальная высота QScrollArea составляет 100 пикселей), но достаточно большая, чтобы показать е этикетки без прокрутки высоты
  • На третьем виджете должна быть 130px, и должна появиться полоса прокрутка (эта часть является правильной в каждом случае я пытался когда вертикальная sizePolicy установлена ​​в Ignored за исключением)

I понять, что мне может потребоваться переопределить некоторые вещи, чтобы сделать эту работу, поскольку сама по себе неясно, почему высота QScrollArea может зависеть от ее дочерних виджетов (что, вероятно, поэтому не было спроектировано таким образом, чтобы сделать это легко или, по крайней мере, кажется это не было).

Однако, я думаю, что случай, который я пытаюсь сделать, достаточно распространен, и мой нынешний подход оправдан. Если есть другой/лучший способ сделать прокрутку отдельного виджета после достижения максимальной высоты, я открыт для этого в качестве ответа, если он соответствует трем условиям, которые я ожидаю.

+0

Вы пробовали устанавливать политики размера в видовых экранах вместо самих областей прокрутки? –

+0

Наверное, нет. Что такое видовой экран? :) – Assimilater

+0

Google: Видовой экран - это виджет внутри QScrollArea, в котором отображаются все дочерние виджеты? Я также попытался настроить это, да. В настоящее время я установил для 'Fixed' – Assimilater

ответ

0

Это больше похоже на хак, чем на решение, но оно работает для меня, по крайней мере, в краткосрочной перспективе. Поскольку текст lblNotes не изменяет время выполнения, я был в состоянии добавить следующий код в конструкторе моего TableRow виджета:

// Hack to resize QScrollAreas 
ui->lblNotes->adjustSize(); // Otherwise lblNotes will think its height is still ~0px 
int height = ui->lblNotes->height() + 12; // Borders and margins add up to 12px 
if (height > 100) { height = 100; } // Cap the height at desired maximum value 
ui->scrollArea->setFixedHeight(height); 

Должен ли я иметь дело со случаем динамически установить текст, я мог бы обернуть этот в функции, которая будет вызываться в любое время, когда будет установлен текст lblNotes.

Я по-прежнему открыт для решений, в которых используются функции компоновки. Qt изначально, поскольку я считаю, что было бы предпочтительным, если решение существует. Содержание QScrollArea может быть не таким прямым, чтобы определить высоту в будущем.

Смежные вопросы