我正在尝试放置 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
的小部件。因为我想在 UI 显示后添加元素,所以我必须这样做,我不确定这是否真的正确:self.realmLayout.addWidget(QLabel("test"))
# realmScrollInner bound to realmScroll
realmScroll.setWidget(realmScrollInner)
self.container.addWidget(realmScroll)
# Access realmScroll's widget and then layout to add
realmScroll.widget().layout().addWidget(QLabel("test"))
但是如果你删除第一次调用
addWidget
在小部件被绑定(bind)之前(因此布局没有小部件),然后绑定(bind)到之后添加的 ScrollArea 小部件不显示。也许 ScrollArea 需要重新绘制(尽管我没有看到这样做的方法)?更新 2 : 调用
repaint()
在 realmScroll 或其包含的小部件上什么都不做,调用 activate/update()
也是如此。在布局上。
最佳答案
事实证明,通过将布局作为小部件的布局,我走错了路。执行此操作的实际方法很简单:
scrollarea = QScrollArea(parent.widget())
layout = QVBoxLayout(scrollarea)
realmScroll.setWidget(layout.widget())
layout.addWidget(QLabel("Test"))
我很确定我最初尝试过,但是嘿它正在工作。
然而,这增加了一个问题,即布局的项目垂直收缩,而不是导致滚动区域添加滚动条。
关于qt - 如何创建可滚动的 QVBoxLayout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6566027/