python - 使用 QScrollArea 折叠子部件

标签 python pyqt pyqt5 qscrollarea

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

更改前:

Before modification

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

更改为QScrollArea后:After the modification

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

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

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

如何重现:

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)允许部署组框的内容并修复问题的第一部分。但仍然没有滚动条。

最佳答案

您有 2 个错误:

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

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

考虑到上述情况,解决方案是:

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()

关于python - 使用 QScrollArea 折叠子部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66210184/

相关文章:

javascript - 使用 Python PyQt 使用 Javascript 内容进行 Web 抓取

python - PyQt5 突出显示选定的 TreeWidget 单元格

python - Python无法在Raspberry Pi上编译

python - 删除 celery 中的 Task/PeriodicTask

python - 不支持 pycharm flask 项目

Python:未显示单个记录,不知道为什么

python-3.x - PyQt6: AttributeError: 类型对象 'QImage' 没有属性 'Format_RGB888'

python-3.x - PyQt5 : How to delete widget once video gets over and put a picture at the place of video player

python - 如何向 QTableWidget 的单元格添加右键单击操作(不是菜单)

python - 用于在python中连接数据excel数据的循环文件名?