def get_widget_by_type(obj): if type(obj) == int: widget = QSpinBox() widget.setRange(INT_RANGE_MIN, INT_RANGE_MAX) widget.setSingleStep(INT_RANGE_STEP) widget.setValue(obj) widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) elif type(obj) == float: widget = QDoubleSpinBox() widget.setRange(FLOAT_RANGE_MIN, FLOAT_RANGE_MAX) widget.setSingleStep(FLOAT_RANGE_STEP) widget.setValue(obj) widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) elif type(obj) == str: widget = QLineEdit() widget.setText(obj) elif type(obj) == bool: widget = QCheckBox() widget.setChecked(obj) elif type(obj) == list: widget = QComboBox() widget.addItems(obj) widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) elif type(obj) == tuple: widget = QFrame() if len(obj) <= 3: box = QHBoxLayout() else: box = QVBoxLayout() box.setMargin(0) for item in obj: value_widget = QLabel(f"{item}") value_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) value_widget.setObjectName("tuple") box.addWidget(value_widget) widget.setLayout(box) elif type(obj) == dict: widget = QFrame() # If less than 3 items, lay it out horizontally else vertically # if len(obj) <= 3: # box = QHBoxLayout() # else: # box = QVBoxLayout() # box.setMargin(0) grid = QGridLayout() grid.setMargin(0) row = 0 for key in obj: label = QLabel(f"{key.capitalize()}:") grid.addWidget(label, row, 0) value_widget = get_widget_by_type(obj[key]) value_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) grid.addWidget(value_widget, row, 1) try: value_widget.setRange(INT_RANGE_MIN, INT_RANGE_MAX) value_widget.setSingleStep(INT_RANGE_STEP) value_widget.setValue(obj[key]) except: pass row += 1 widget.setLayout(grid) # TODO: Lists inside of lists. Should probably use QTreeView # elif type(obj) == list: # widget = [] # for l in obj: # widget.append(QComboBox()) # widget[-1].addItems(obj) # widget[-1].setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) return widget