0

I need to place multiple QGroupBox widgets within a QScrollArea. However, if I add too many groups and their combined size exceeds the size of the scroll area, instead of making the space scrollable, the size of each group gets reduced to the point where I can no longer see the other widgets inside these groups.

Here is how my scroll area is defined:

class ParamWindow():

def __init__(self,index):

    self.layer = Layer.sample_layer[index]


    self.small_window  = QtWidgets.QMainWindow()
    self.small_window.setObjectName("MainWindow")
    self.small_window.resize(800, 800)

    self.centralwidget = QtWidgets.QWidget(parent=self.small_window)
    self.centralwidget.setEnabled(True)
    self.centralwidget.setObjectName("centralwidget")


    self.small_window.setCentralWidget(self.centralwidget)
    self.small_window.setWindowTitle("initial parameters")

    self.label_layer = QtWidgets.QLabel(parent=self.centralwidget)
    self.label_layer.setText(f"Layer #{index+1} : {self.layer.name}")
    self.label_layer.setGeometry(QtCore.QRect(350, 0, 100, 20))
    self.label_layer.setObjectName("label_layer")


    self.scrollArea = QtWidgets.QScrollArea(parent=self.centralwidget)
    self.scrollArea.setGeometry(QtCore.QRect(0, 100, 800, 700))
    self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
    self.scrollArea.setWidgetResizable(True)
    self.scrollArea.setObjectName("scrollArea")
 

    self.scrollAreaWidgetContents = QtWidgets.QWidget()
    self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 800, 700))
    self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")

    
    self.layout_scroll=QtWidgets.QVBoxLayout()
    self.scrollAreaWidgetContents.setLayout(self.layout_scroll)


    self.scrollArea.setWidget(self.scrollAreaWidgetContents)

    QtCore.QMetaObject.connectSlotsByName(self.small_window)


    self.setup_thickness()

    if self.layer.term_in_FB != None :
        self.setup_Eg()
        self.setup_n_inf()
        self.setup_term()

    self.small_window.show()   

The functions self.setup_Eg(), self.setup_n_inf(), self.setup_term(), and self.setup_thickness() are used to add QGroupBox widgets to the scroll area. self.setup_Eg , setup_thickness , self.setup_n_inf have similar structure that look like

    def setup_Eg(self):

    self.group_Eg = QtWidgets.QGroupBox(parent=self.scrollAreaWidgetContents)
    self.group_Eg.setGeometry(QtCore.QRect(50, 50, 500, 100))
    self.group_Eg.setObjectName("group_Eg")
    self.group_Eg.setTitle("Eg")

    self.radio_Eg_spread = QtWidgets.QRadioButton(parent=self.group_Eg)
    self.radio_Eg_spread.setGeometry(QtCore.QRect(20, 20, 200, 50))
    self.radio_Eg_spread.setText("Use spread")
    self.radio_Eg_spread.setObjectName("radio_Eg_spread")
    self.radio_Eg_spread.setChecked(True)

    self.radio_Eg_bound = QtWidgets.QRadioButton(parent=self.group_Eg)
    self.radio_Eg_bound.setGeometry(QtCore.QRect(240, 20, 200, 50))
    self.radio_Eg_bound.setText("Use bound")
    self.radio_Eg_bound.setObjectName("radio_Eg_bound")
    self.radio_Eg_bound.setChecked(False)


    self.label_1_Eg = QtWidgets.QLabel(parent=self.group_Eg)
    self.label_1_Eg.setObjectName("label_1_Eg")
    self.label_1_Eg.setGeometry(QtCore.QRect(20, 60, 100, 30))
    self.label_1_Eg.setText("Center value")

    self.label_2_Eg = QtWidgets.QLabel(parent=self.group_Eg)
    self.label_2_Eg.setObjectName("label_2_Eg")
    self.label_2_Eg.setGeometry(QtCore.QRect(240, 60, 100, 30))
    self.label_2_Eg.setText("Spread value")



    self.input_1_Eg = QtWidgets.QSpinBox(parent=self.group_Eg)
    self.input_1_Eg.setObjectName("input_1_Eg")
    self.input_1_Eg.setGeometry(QtCore.QRect(120, 60, 100, 30))
    
    self.input_2_Eg = QtWidgets.QSpinBox(parent=self.group_Eg)
    self.input_2_Eg.setObjectName("input_2_Eg")
    self.input_2_Eg.setGeometry(QtCore.QRect(340, 60, 100, 30))


    self.radio_Eg_bound.clicked.connect(lambda : self.choose_spread_or_bound(button_1=self.radio_Eg_spread,button_2=self.radio_Eg_bound,label_1=self.label_1_Eg,label_2=self.label_2_Eg))
    self.radio_Eg_spread.clicked.connect(lambda : self.choose_spread_or_bound(button_1=self.radio_Eg_spread,button_2=self.radio_Eg_bound,label_1=self.label_1_Eg,label_2=self.label_2_Eg))
    
    self.scrollAreaWidgetContents.layout().addWidget(self.group_Eg)

and setup-term is a little different but still similar

    def setup_term(self):
    term = self.layer.term_in_FB
    for i in range(term):
        
        group_center = QtWidgets.QGroupBox(parent=self.scrollAreaWidgetContents)
        group_center.setGeometry(QtCore.QRect(50, 50, 500, 100))
        group_center.setTitle(f"Center {i+1}")
        

        radio_spread_center = QtWidgets.QRadioButton(parent=group_center)
        radio_spread_center.setGeometry(QtCore.QRect(20, 20, 200, 50))
        radio_spread_center.setText("Use spread")
        radio_spread_center.setChecked(True)

        radio_bound_center = QtWidgets.QRadioButton(parent=group_center)
        radio_bound_center.setGeometry(QtCore.QRect(240, 20, 200, 50))
        radio_bound_center.setText("Use bound")
        radio_bound_center.setChecked(False)

        label_1_center = QtWidgets.QLabel(parent=group_center)
        label_1_center.setGeometry(QtCore.QRect(20, 60, 100, 30))
        label_1_center.setText("Center value")

        label_2_center = QtWidgets.QLabel(parent=group_center)
        label_2_center.setGeometry(QtCore.QRect(240, 60, 100, 30))
        label_2_center.setText("Spread value")



        input_1_center = QtWidgets.QSpinBox(parent=group_center)
        input_1_center.setGeometry(QtCore.QRect(120, 60, 100, 30))
    
        input_2_center = QtWidgets.QSpinBox(parent=group_center)
        input_2_center.setGeometry(QtCore.QRect(340, 60, 100, 30))


        radio_bound_center.clicked.connect(lambda : self.choose_spread_or_bound(button_1=radio_spread_center,button_2=radio_bound_center,label_1=label_1_center,label_2=label_2_center))
        radio_spread_center.clicked.connect(lambda : self.choose_spread_or_bound(button_1=radio_spread_center,button_2=radio_bound_center,label_1=label_1_center,label_2=label_2_center))
    
        self.scrollAreaWidgetContents.layout().addWidget(group_center)

I already try multiple thing like using setSpacing , setStrech , resize .ect but nothing seem to work also note that ParaWindow is not the main window of the project im looking for a solution that dont use Qt designer

Jean-Felix
  • 11
  • 5
  • 1
    You must use [layout managers](//doc.qt.io/qt-5/layout.html), even for child widgets (the group boxes, in your case). Note that you can [do that in Designer](https://doc.qt.io/qt-6/designer-layouts.html) too. Also, you're not expected to edit pyuic generated files. Please follow the official guidelines about [using Designer](//www.riverbankcomputing.com/static/Docs/PyQt6/designer.html) instead. – musicamante May 30 '23 at 23:09

0 Answers0