【问题标题】:Using QScrollArea collapses children widgets使用 QScrollArea 折叠子小部件
【发布时间】:2021-05-18 11:12:26
【问题描述】:

我正在尝试在 QVBoxLayout 中创建具有多个 Groupbox 对象的动态 GUI。由于它们很多,我将需要一个滚动区域以使最终用户可以使用它们。 所以我尝试将此选项卡的顶部小部件从 QWidget 更改为 QScrollArea。

改动前:

这是我想要的结果,但有滚动条,因为窗口太高了。

改成QScrollArea后:

我的 GroupBox 现已“折叠”并且没有滚动条。我尝试设置它们的大小,但这还不够,因为它们不是固定的。我搜索了文档并尝试使用 WidgetResizable,或者我尝试设置固定高度或 sizehint,但没有任何效果。

创建 Groupbox 后,我的 QScrollArea 的 sizeHint 已经非常低(大约 150 像素的高度),所以我认为我缺少一个参数。

提供代码会很复杂,因为它很复杂。如有必要,我可以用更简单的方式重现问题。

如何重现:

from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtWidgets import *
import sys

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):
        
        v_layout = QVBoxLayout()
        scroll_area = QScrollArea()
        self.layout().addWidget(scroll_area)
        scroll_area.setLayout(v_layout)
        # v_layout.setSizeConstraint(QLayout.SetMinimumSize)

        for i in range(50):
            box = QGroupBox()
            grid = QGridLayout()
            box.setLayout(grid)
            grid.addWidget(QLabel("totototo"), 0, 0)
            grid.addWidget(QLineEdit(), 1, 0)
            grid.addWidget(QPushButton(), 2, 0)
            v_layout.addWidget(box)
        self.show()



app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

取消注释# v_layout.setSizeConstraint(QLayout.SetMinimumSize) 允许部署组框的内容并修复问题的第一部分。但是还是没有滚动条。

【问题讨论】:

  • 男孩,它看起来像来自地狱的用户界面吗:-)。看来您的组合框可能有一个糟糕的尺寸政策,使它们缩小了。尝试使用他们的垂直尺寸政策(例如,最小而不是首选)。
  • 确实不是最简单的。我尝试将我的组框的大小策略设置为最小或固定,但它没有帮助。更改组框中小部件的策略是否有任何用处?
  • 您可以尝试,但我希望它们已经正确设置。
  • 要检查的另一件事是滚动区域和组框之间布局的大小策略和约束。
  • 请提供minimal, reproducible example,我们不能只是“猜测”您的代码出了什么问题——即使您很有可能没有正确设置分组框的布局。

标签: python pyqt pyqt5 qscrollarea


【解决方案1】:

您有 2 个错误:

  • 不应将小部件添加到 QMainWindow 的布局中,但应使用 setCentralWidget 方法。

  • 您不应该将布局添加到 QScrollArea,而是使用一个小部件作为其他小部件的容器,如果您使用布局,则必须激活 widgetResizable 属性。

综合以上情况,解决办法是:

def initUI(self):

    scroll_area = QScrollArea(widgetResizable=True)
    self.setCentralWidget(scroll_area)

    container = QWidget()
    scroll_area.setWidget(container)

    v_layout = QVBoxLayout(container)

    for i in range(50):
        box = QGroupBox()
        grid = QGridLayout()
        box.setLayout(grid)
        grid.addWidget(QLabel("totototo"), 0, 0)
        grid.addWidget(QLineEdit(), 1, 0)
        grid.addWidget(QPushButton(), 2, 0)
        v_layout.addWidget(box)

    self.show()

【讨论】:

  • 感谢您指出我的错误。将您的修复添加到我的代码后,它现在可以按预期工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多