Как использовать 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_())

Я хочу добиться этого эффекта. (Только для представления) Но в приведенном выше коде нет скроллера.

введите здесь описание изображения


person Rt Rtt    schedule 21.12.2017    source источник


Ответы (1)


Ваш код имеет следующие проблемы:

  • Вам не нужно добавлять макет в 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()

Выход:

введите описание изображения здесь

person eyllanesc    schedule 21.12.2017
comment
Большое спасибо! Это очень мило с вашей стороны за хорошее объяснение и код! Я действительно новичок в PyQt. Кажется, мне действительно нужно многому научиться. - person Rt Rtt; 21.12.2017
comment
Эй, я хочу спросить вас, сэр, что произойдет, если мы установим макет в области Qscroll. На самом деле я сейчас делаю PyQt и очень быстро потерял понимание макетов. - person Nimish Bansal; 21.12.2017
comment
QScrollArea уже имеет макет по умолчанию, который устанавливает область просмотра (), если вы установите его, вы удалите свойство прокрутки. - person eyllanesc; 21.12.2017
comment
Я знаю, это старый вопрос, но я нашел это, и это было очень полезно, но теперь я борюсь с данными. например как я могу использовать item.stateChanged одного конкретного элемента? - person PythonF; 21.01.2019