def _fill_grid_layout(self, layout: QtGui.QGridLayout): """ Fill a QGridLayout with all MultiForms and Field, in the right order :param layout: :return: """ all_components = [] for multiform in self._multiforms.values(): all_components.append(multiform) for field in self._fields.values(): all_components.append(field) all_components.sort(key=self._sort_components) row_offset = layout.rowCount() for row_index, obj in enumerate(all_components): if isinstance(obj, MultiForm): # a MultiForm already is a QWidget layout.addWidget(obj, row_offset + row_index, 0, 1, 2) elif isinstance(obj, SubForm): widget = QtGui.QGroupBox(str(obj.verbose_name), p(self)) sub_layout = QtGui.QGridLayout(p(widget)) obj._fill_grid_layout(sub_layout) widget.setLayout(sub_layout) layout.addWidget(widget, row_offset + row_index, 0, 1, 2) else: widget = obj.get_widget(self, self) self._widgets[obj.name] = widget obj.set_widget_value(widget, self._values[obj.name]) if obj.label: label = QtGui.QLabel(obj.label, p(self)) label.setDisabled(obj.disabled) layout.addWidget(label, row_offset + row_index, 0) layout.addWidget(widget, row_offset + row_index, 1)