qt - 如何创建可滚动的 QVBoxLayout?

标签 qt pyqt

我正在尝试放置 QVBoxLayoutQScrollArea 内以便它可以垂直滚动。但是项目似乎没有添加到它。

我看到一个建议,我应该创建一个 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/

相关文章:

python - 涉及pyqt时文件复制太慢

c++ - "Reparent"来自编译代码的类

c++ - 将鼠标单击事件添加到使用 QtCreator 创建的 QGraphicsView

python - PyQt6在QSlider的paintEvent中设置自定义矩形

multithreading - 如何通过调用另一个函数的QThread更新PyQT中的Progressbar

python-3.x - 在 PyQt5 中,如何使用拖放正确移动 QTableView 中的行

qt - 在 ListView QML 中隐藏一个项目(委托(delegate))

windows - QStringList QCoreApplication::arguments() - 在什么情况下索引 0 不是 Windows 中的应用程序路径?

c++ - 使用我的配置类 (C++) 无法解析的外部符号

python - 基于 Clicked 将单个 Python Def 用于多个 QpushButton