class ValueEdit(QWidget): def __init__(self, title, unit, number_type='double', parent=None): super(ValueEdit, self).__init__(parent) self.title = QLabel(title) self.title.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.unit = QLabel(unit) self.unit.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) if number_type == 'double': self.edit = QDoubleSpinBox() elif number_type == 'int': self.edit = QSpinBox() else: raise ValueError( 'Editor can either be for double or integer values') self.edit.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) self.edit.setKeyboardTracking(False) self.edit.setAlignment(Qt.AlignRight) self.edit.setButtonSymbols(QAbstractSpinBox.NoButtons) def set_range_decimals(self, min, max, decimals=3): self.edit.setRange(min, max) if isinstance(self.edit, QDoubleSpinBox): self.edit.setDecimals(decimals) def set_single_step_size(self, step=.1): self.edit.setSingleStep(step) def value(self): return self.edit.value() @Slot(float) def setValue(self, value): self.edit.setValue(value)
class IntEditor(QWidget): def __init__(self, minval, maxval, stepsize=1, parent=None): super(IntEditor, self).__init__(parent) # Editfield self.edit = QSpinBox(self) self.edit.setKeyboardTracking(False) self.edit.setRange(minval, maxval) self.edit.setSingleStep(stepsize) self.edit.setMinimumWidth(70) # Slider self.slider = QSlider(orientation=Qt.Vertical, parent=self) self.slider.setRange(minval, maxval) self.slider.setSingleStep(stepsize) self.slider.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding) # Ticks q_ticks = QSlider.TicksBelow self.slider.setTickPosition(q_ticks) tick_amount = 6 tick_interval = int(np.floor((maxval - minval) / tick_amount)) self.slider.setTickInterval(tick_interval) # ...labels font = QFont() font.setPointSize(8) tick_str1 = QLabel('{:d}'.format(minval), self) tick_str2 = QLabel('{:d}'.format(maxval), self) tick_str1.setFont(font) tick_str2.setFont(font) slider_tick_layout = QGridLayout() tick_str1.setAlignment(Qt.AlignBottom | Qt.AlignLeft) tick_str2.setAlignment(Qt.AlignTop | Qt.AlignLeft) slider_tick_layout.addWidget(self.slider, 0, 0, tick_amount, 1) slider_tick_layout.addWidget(tick_str2, 0, 1, 1, 1) slider_tick_layout.addWidget(tick_str1, tick_amount - 1, 1, 1, 1) # Layout layout = QVBoxLayout() layout.addLayout(slider_tick_layout) layout.addWidget(self.edit) self.setLayout(layout) # Signals and slots self.edit.valueChanged.connect(self.slider.setValue) self.slider.valueChanged.connect(self.edit.setValue)