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

Как изменить размер содержимого QScrollArea, поскольку все больше виджетов размещены внутри

У меня есть QScrollArea Виджет, который начинается пустым,

empty QScrollArea

Он имеет вертикальную компоновку с QGridLayout и вертикальную проставку, чтобы держать ее сверху, и препятствовать ее растяжению по всей области прокрутки;

QScrollArea in Qt Designer

В другом месте программы есть QTextEdit, который при изменении имеет свое содержимое, сканируемое для элементов "species", а затем они добавляются в QGridLayout. Также удаляются все элементы вида, которые были удалены. Этот бит работает;

QScrollArea with strange scroll bar

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

Это проблема. Прокрутка области, как представляется, предварительно, и я не могу изменить его. Если я добавлю больше строк в QGridLayout, область прокрутки не будет увеличиваться в размере.

Вместо этого он остается того же размера и сжимает QGridLayout, делая его выглядящим уродливым (сначала);

Squashed QGridLayout

И затем, добавив еще больше, он становится непригодным;

unusable line edits

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

Если я изменяю размер окна так, чтобы QScrollArea увеличивался, я вижу следующее:

dumb too small layout

Указание на наличие макета внутри области прокрутки, которая не изменяется правильно.

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

4b9b3361

Ответ 1

Документация дает ответ:

widgetResizable: bool
Это свойство сохраняет ли область прокрутки изменять размер виджета вида. Если для этого свойства установлено значение false (по умолчанию), область прокрутки отличает размер его виджета.

Установите значение true.

Ответ 2

Если вы приедете сюда из Google и не повезете с принятым ответом, это потому, что вам не хватает другого секретного вызова: QScrollArea::setWidget. Вы должны создать и явно идентифицировать один виджет, который нужно прокрутить. Этого недостаточно, чтобы просто добавить товар в качестве ребенка! Добавление нескольких элементов непосредственно в ScrollArea также не будет работать.

Этот script демонстрирует простой рабочий пример QScrollArea:

from PySide.QtGui import *

app = QApplication([])

scroll = QScrollArea()
scroll.setWidgetResizable(True) # CRITICAL

inner = QFrame(scroll)
inner.setLayout(QVBoxLayout())

scroll.setWidget(inner) # CRITICAL

for i in range(40):
    b = QPushButton(inner)
    b.setText(str(i))
    inner.layout().addWidget(b)

scroll.show()
app.exec_()

Ответ 3

Почему вы не используете QListView для своих строк, он будет управлять всеми проблемами для вас? Просто убедитесь, что после его добавления вы нажимаете на класс (в верхнем правом окне конструктора) и назначаете макет, иначе он не будет нормально расширяться.

Я использую QLIstWidget внутри QScrollArea, чтобы создать список прокручиваемых изображений

Попробуйте это для добавления других объектов в список, вот как я добавляю изображение в список.

QImage& qim = myclass.getQTImage();

QImage iconImage = copyImageToSquareRegion(qim, ui->display_image->palette().color(QWidget::backgroundRole()));

QListWidgetItem* pItem = new QListWidgetItem(QIcon(QPixmap::fromImage(iconImage)), NULL);

pItem->setData(Qt::UserRole, "thumb" + QString::number(ui->ImageThumbList->count()));  // probably not necessary for you

QString strTooltip = "a tooltip"

pItem->setToolTip(strTooltip);

ui->ImageThumbList->addItem(pItem);