Как я могу изменить содержимое QScrollArea как больше виджетов помещаются
У меня есть QScrollArea виджет, который начинается пустой;
Он имеет вертикальную компоновку, с QGridLayout, и вертикальную прокладку, чтобы держать его в верхней части, и предотвратить его от растягивания по всей области прокрутки;
в другом месте программы есть QTextEdit, который при изменении его содержимого сканируется на "виды" элементов, а затем они добавляются в QGridLayout. Любые видовые элементы которые были удалены, также удаляются. Этот бит работает;
Я все время включал вертикальную полосу прокрутки, так что, когда она появляется, она не сидит поверх других вещей. Обратите внимание, что полоса прокрутки уже больше, чем поле прокрутки, несмотря на то, что это не нужно.
Это проблема. Область прокрутки кажется предустановленной, и я не могу ее изменить. Если я добавлю больше строк в QGridLayout, область прокрутки не увеличится по размеру.
вместо этого он остается того же размера и сжимает QGridLayout, что делает его уродливым (сначала);
а затем после добавления еще больше становится непригодным;
обратите внимание, что полоса прокрутки по-прежнему имеет тот же размер, что и на предыдущих изображениях. Первые два изображения из Qt Designer, последующие 3 - из запущенной программы.
Если я изменю размер окна так, чтобы QScrollArea растет, потом вижу такое:
указывает, что внутри области прокрутки есть какой-то макет, который не изменяется должным образом.
мой вопрос; что мне нужно сделать, чтобы прокручиваемая область виджета динамически изменялась при добавлении и удалении из QGridLayout?
3 ответов
на документация дать ответ :
widgetResizable: bool
Это свойство определяет, должна ли область прокрутки изменять размер виджета представления. Если это свойство имеет значение false (по умолчанию), область прокрутки соответствует размеру виджета.
установите значение true.
Если вы приходите сюда из Google и не везет с принятым ответом, это потому, что вам не хватает другого секретного вызова:QScrollArea::setWidget
. Вы должны создать и явно определите один виджет, который будет прокручиваться. Недостаточно просто добавить элемент в качестве ребенка! Добавление нескольких элементов непосредственно в ScrollArea
также не будет работать.
этот скрипт демонстрирует простой рабочий пример 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_()
почему бы вам не использовать 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);