我正在尝试将一个
我看到有人建议我创建一个内部小部件,让 ScrollArea 使用并将布局放置在其中,尽管它似乎没有起作用。我的结构应该是这样的:
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(两天),所以深入解答我做错了什么会很有帮助。
更新:
似乎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"))
但如果在widget被绑定之前删除第一个对 addWidget
的调用(所以布局没有widgets),然后绑定到之后添加的ScrollArea widgets将不会显示。也许ScrollArea需要重绘(尽管我没有看到方法)?
更新2:在realmScroll或其包含的widget上调用repaint()
无效,调用布局上的activate/update()
也是如此。