【发布时间】:2011-09-27 19:19:06
【问题描述】:
我正在尝试将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 的第一次调用(因此布局没有小部件),则绑定到之后添加的 ScrollArea 小部件不会显示。也许 ScrollArea 需要重新绘制(尽管我没有看到这样做的方法)?
更新 2:在 realmScroll 或其包含的小部件上调用 repaint() 没有任何作用,在布局上调用 activate/update() 也是如此。
【问题讨论】: