Python + PyQt5:如何将QScrollArea用于一个或多个QGroupBox?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python + PyQt5:如何将QScrollArea用于一个或多个QGroupBox?相关的知识,希望对你有一定的参考价值。

我一直在尝试将一个/多个QGroupBox插入一个QScrollArea。

问题是:滚动条没有显示。

这是我的代码:

# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QCheckBox
from PyQt5.QtWidgets import QGroupBox
from PyQt5.QtWidgets import QScrollArea

from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QHBoxLayout, QVBoxLayout, QGridLayout

import sys

lst = [u"D", u"E", u"EF", u"F", u"FG", u"G", u"H", u"JS", u"J", u"K", u"M", u"P", u"R", u"S", u"T", u"U", u"V", u"X", u"Y", u"Z"]

class MyApp(QWidget):
    def __init__(self):
        super(MyApp, self).__init__()

        window_width = 1200
        window_height = 600
        self.setFixedSize(window_width, window_height)

        self.initUI()

    def createLayout_group(self):
        self.groupbox = QGroupBox(u"Group1:")
        self.layout_groupbox = QVBoxLayout()

        for i in range(len(lst)):
            self.item = QCheckBox(lst[i], self.groupbox)
            self.layout_groupbox.addWidget(self.item)
        self.layout_groupbox.addStretch(1)

        self.groupbox.setLayout(self.layout_groupbox)


    def createLayout_Container(self):

        self.scrollarea = QScrollArea(self)
        self.scrollarea.setFixedSize(250, 6000)
        self.scrollarea.setWidgetResizable(False)

        self.layout_SArea = QVBoxLayout()
        self.layout_SArea.addWidget(self.groupbox)
        self.layout_SArea.addWidget(self.groupbox) # add groupbox one more to test
        self.layout_SArea.addWidget(self.groupbox) # add groupbox one more to test
        self.layout_SArea.addStretch(1)

        self.scrollarea.setLayout(self.layout_SArea)



    def initUI(self):
        self.createLayout_group()   # load one groupbox
        self.createLayout_Container()  # load groupbox container

        self.layout_All = QVBoxLayout()
        self.layout_All.addWidget(self.scrollarea)
        self.setLayout(self.layout_All)

        self.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    sys.exit(app.exec_())

我想达到这个效果。 (仅用于表示)但上面的代码显示没有滚动条。

enter image description here

答案

您的代码存在以下问题:

  • 您不必向QScrollArea添加布局,您必须传递的是窗口小部件,因此必须将您构建的布局添加到窗口小部件,并且该窗口小部件必须设置为QScrollArea。
  • 每次调用createLayout_group时,你都会覆盖self.groupbox类的成员,self.layout_groupbox等,这是不必要的并且可能导致问题,该方法返回QGroupBox是正确的。
  • 另一个错误是,如果你使用setWidgetResizable(False)内部小部件将签约,这是不悦目的
  • 另一个问题是你不应该设置一个固定的大小,而只是一个固定的宽度,如果你想设置一个固定的大小,那么你应该始终可以看到滚动条。

lst = [u"D", u"E", u"EF", u"F", u"FG", u"G", u"H", u"JS", u"J", u"K", u"M", u"P", u"R", u"S", u"T", u"U", u"V", u"X", u"Y", u"Z"]

class MyApp(QWidget):
    def __init__(self):
        super(MyApp, self).__init__()
        window_width = 1200
        window_height = 600
        self.setFixedSize(window_width, window_height)
        self.initUI()

    def createLayout_group(self, number):
        sgroupbox = QGroupBox("Group{}:".format(number), self)
        layout_groupbox = QVBoxLayout(sgroupbox)
        for i in range(len(lst)):
            item = QCheckBox(lst[i], sgroupbox)
            layout_groupbox.addWidget(item)
        layout_groupbox.addStretch(1)
        return sgroupbox

    def createLayout_Container(self):
        self.scrollarea = QScrollArea(self)
        self.scrollarea.setFixedWidth(250)
        self.scrollarea.setWidgetResizable(True)

        widget = QWidget()
        self.scrollarea.setWidget(widget)
        self.layout_SArea = QVBoxLayout(widget)

        for i in range(5):
            self.layout_SArea.addWidget(self.createLayout_group(i))
        self.layout_SArea.addStretch(1)

    def initUI(self):
        self.createLayout_Container()
        self.layout_All = QVBoxLayout(self)
        self.layout_All.addWidget(self.scrollarea)
        self.show()

输出:

enter image description here

以上是关于Python + PyQt5:如何将QScrollArea用于一个或多个QGroupBox?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PyQt5 Python 将 QTableWidget 数据转换为 PDF

如何使用 PyQt5 和 python 3.6 将 .ui 文件转换为 .py 文件

如何在python中使用pyqt5将QSlider添加到主窗口的工具栏

如何将变量传递给连接到按钮pyqt5 python的函数[关闭]

Python + PyQt5:如何将QScrollArea用于一个或多个QGroupBox?

Python PyQt5如何更改最小化图标