Я пытаюсь установить QVBoxLayout
внутри QScrollArea
, чтобы он мог прокручиваться по вертикали. Однако элементы, похоже, не добавляются к нему.
Я увидел предположение, что я должен создать внутренний виджет, который использует ScrollArea, и разместить его внутри, хотя он, похоже, не сработал. Моя структура должна выглядеть так:
+-------------------------------
| QScrollArea(realmScroll)
| +----------------------------
| | QWidget(realmScrollInner)
| | +-------------------------
| | | QVBoxLayout(realmLayout)
И код для этого:
# Irrelevant, added for context (this works)
centralWidget = QWidget(self)
self.container = QVBoxLayout(centralWidget)
centralWidget.setLayout(self.container)
self.setCentralWidget(centralWidget)
# Where trouble starts
self.realmScroll = QScrollArea(self.container.widget())
self.realmScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.realmLayout = QVBoxLayout(self.container.widget())
self.realmScrollInner = QWidget(self.realmScroll)
self.realmScrollInner.setLayout(self.realmLayout)
self.realmScroll.setWidget(self.realmScrollInner)
self.container.addWidget(self.realmScroll)
# Doesn't add to realmLayout
self.realmLayout.addWidget(QLabel("test"))
Я все еще участвую в Qt (2 дня в году), поэтому будут учтены подробные ответы на то, где я ошибаюсь.
Обновление
Кажется, что addWidget(QLabel())
работает до тех пор, пока realmScrollInner
не будет установлен в качестве realmScroll
виджета. Поскольку я хотел бы добавить элементы после отображения пользовательского интерфейса, я должен сделать это, и я не уверен, что это действительно правильно:
self.realmLayout.addWidget(QLabel("test"))
# realmScrollInner bound to realmScroll
realmScroll.setWidget(realmScrollInner)
self.container.addWidget(realmScroll)
# Access realmScroll widget and then layout to add
realmScroll.widget().layout().addWidget(QLabel("test"))
Но если вы удалите этот первый вызов addWidget
до того, как виджет был привязан (поэтому в макете нет виджета), привязка к виджетам ScrollArea, добавленным впоследствии, не отображается. Возможно, ScrollArea нуждается в перекраске (хотя я не вижу метода для этого)?
Обновление 2. Вызов repaint()
в режиме realmScroll или его содержащийся виджет ничего не делает, как и вызов activate/update()
в макете.