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