def intspin(): s = QSpinBox(self) s.setMinimum(2) s.setMaximum(10) s.setFixedWidth(60) s.setAlignment(Qt.AlignRight) s.setContentsMargins(0, 0, 0, 0) return s, s.valueChanged
class ControlBoundingSlider(ControlBase): def __init__(self, *args, **kwargs): self._horizontal = kwargs.get('horizontal', True) self._show_spinboxes = kwargs.get('show_spinboxes', True) ControlBase.__init__(self, *args, **kwargs) self.min = kwargs.get('min', kwargs.get('minimum', 0)) self.max = kwargs.get('max', kwargs.get('maximum', 100)) self.value = kwargs.get('default', [10,20]) self.__update() def init_form(self): self._boundingbox = GaugeWidgetHorizontal() if self._horizontal else GaugeWidgetVertical() self._boundingbox.changed_event = self.__update if self._show_spinboxes: self._form = hwidget = QWidget() if self._horizontal: hlayout = QHBoxLayout() else: hlayout = QVBoxLayout() if _api.USED_API == _api.QT_API_PYQT5: hlayout.setContentsMargins(0,0,0,0) elif _api.USED_API == _api.QT_API_PYQT4: hlayout.setMargin(0) hwidget.setLayout(hlayout) self._min_spinbox = QSpinBox() self._min_spinbox.valueChanged.connect(self.__min_spinbox_changed) self._min_spinbox.setMaximumWidth(95) self._max_spinbox = QSpinBox() self._max_spinbox.valueChanged.connect(self.__max_spinbox_changed) self._max_spinbox.setMaximumWidth(95) if self._horizontal: hlayout.addWidget(self._min_spinbox) else: hlayout.addWidget(self._max_spinbox) hlayout.addWidget(self._boundingbox) if self._horizontal: hlayout.addWidget(self._max_spinbox) else: hlayout.addWidget(self._min_spinbox) else: self._form = self._boundingbox super(ControlBoundingSlider, self).init_form() def __max_spinbox_changed(self, value): if value < self._boundingbox._minVal: return if hasattr(self, '_is_updating_spinboxes'): return self.scale = self.__find_scale_factor(value) self._boundingbox._maxVal = value self._boundingbox.repaint() self.changed_event() def __min_spinbox_changed(self, value): if value > self._boundingbox._maxVal: return if hasattr(self, '_is_updating_spinboxes'): return self.scale = self.__find_scale_factor(value) self._boundingbox._minVal = value self._boundingbox.repaint() self.changed_event() def __update(self): l, h = self._boundingbox._minVal, self._boundingbox._maxVal self._is_updating_spinboxes = True self._min_spinbox.setValue(l) self._max_spinbox.setValue(h) del self._is_updating_spinboxes self.changed_event() def changed_event(self): pass def __find_scale_factor(self, value): scale = 1.0 new_value = value while abs(new_value) < 0.0: scale *= 10.0 new_value = value * scale return scale def load_form(self, data, path=None): """ Load a value from the dict variable @param data: dictionary with the value of the Control """ self.convert_2_int = data.get('convert-int', self.convert_2_int) self.scale = data.get('scale', self.scale) self.max = data.get('max', self.max) self.min = data.get('min', self.min) self.value = data.get('value', self.value) def save_form(self, data, path=None): """ Save a value to dict variable @param data: dictionary with to where the value of the Control will be added """ data['value'] = self.value data['max'] = self.max data['min'] = self.min data['scale'] = self.scale data['convert-int'] = self.convert_2_int return data ########################################################################## ############ Properties ################################################## ########################################################################## @property def value(self): return self._boundingbox._minVal, self._boundingbox._maxVal @value.setter def value(self, value): self.scale = self.__find_scale_factor(value[0]) self._boundingbox._minVal, self._boundingbox._maxVal = value[0], value[1] if hasattr(self, '_min_spinbox'): self._min_spinbox.setValue(value[0]) if hasattr(self, '_max_spinbox'): self._max_spinbox.setValue(value[1]) ControlBase.value.fset(self, value) self._boundingbox.repaint() @property def min(self): return self._boundingbox._lower @min.setter def min(self, value): self._boundingbox._lower = value self._boundingbox.repaint() if hasattr(self, '_min_spinbox'): self._min_spinbox.setMinimum(value) if hasattr(self, '_max_spinbox'): self._max_spinbox.setMinimum(value) @property def max(self): return self._boundingbox._higher @max.setter def max(self, value): self._boundingbox._higher = value self._boundingbox.repaint() if hasattr(self, '_min_spinbox'): self._min_spinbox.setMaximum(value) if hasattr(self, '_max_spinbox'): self._max_spinbox.setMaximum(value) @property def scale(self): return self._boundingbox.scale @scale.setter def scale(self, value): self._boundingbox.scale = value @property def convert_2_int(self): return not self._boundingbox._use_float @convert_2_int.setter def convert_2_int(self, value): self._boundingbox._use_float = not value
class ControlBoundingSlider(ControlBase): def __init__(self, label="", default=[20, 40], min=0, max=100, horizontal=False, helptext=None, show_spinboxes=True): self._horizontal = horizontal self._show_spinboxes = show_spinboxes ControlBase.__init__(self, label, default, helptext=helptext) self.min = min self.max = max self.value = default self.__update() def init_form(self): self._boundingbox = GaugeWidgetHorizontal( ) if self._horizontal else GaugeWidgetVertical() self._boundingbox.changed_event = self.__update if self._show_spinboxes: self._form = hwidget = QWidget() if self._horizontal: hlayout = QHBoxLayout() else: hlayout = QVBoxLayout() if conf.PYFORMS_USE_QT5: hlayout.setContentsMargins(0, 0, 0, 0) else: hlayout.setMargin(0) hwidget.setLayout(hlayout) self._min_spinbox = QSpinBox() self._min_spinbox.valueChanged.connect(self.__min_spinbox_changed) self._min_spinbox.setMaximumWidth(95) self._max_spinbox = QSpinBox() self._max_spinbox.valueChanged.connect(self.__max_spinbox_changed) self._max_spinbox.setMaximumWidth(95) if self._horizontal: hlayout.addWidget(self._min_spinbox) else: hlayout.addWidget(self._max_spinbox) hlayout.addWidget(self._boundingbox) if self._horizontal: hlayout.addWidget(self._max_spinbox) else: hlayout.addWidget(self._min_spinbox) else: self._form = self._boundingbox super(ControlBoundingSlider, self).init_form() def __max_spinbox_changed(self, value): if value < self._boundingbox._minVal: return if hasattr(self, '_is_updating_spinboxes'): return self.scale = self.__find_scale_factor(value) self._boundingbox._maxVal = value self._boundingbox.repaint() self.changed_event() def __min_spinbox_changed(self, value): if value > self._boundingbox._maxVal: return if hasattr(self, '_is_updating_spinboxes'): return self.scale = self.__find_scale_factor(value) self._boundingbox._minVal = value self._boundingbox.repaint() self.changed_event() def __update(self): l, h = self._boundingbox._minVal, self._boundingbox._maxVal self._is_updating_spinboxes = True self._min_spinbox.setValue(l) self._max_spinbox.setValue(h) del self._is_updating_spinboxes self.changed_event() def changed_event(self): pass def __find_scale_factor(self, value): scale = 1.0 new_value = value while abs(new_value) < 0.0: scale *= 10.0 new_value = value * scale return scale ########################################################################## ############ Properties ################################################## ########################################################################## @property def value(self): return self._boundingbox._minVal, self._boundingbox._maxVal @value.setter def value(self, value): ControlBase.value.fset(self, value) self.scale = self.__find_scale_factor(value[0]) self._boundingbox._minVal, self._boundingbox._maxVal = value[0], value[ 1] if hasattr(self, '_min_spinbox'): self._min_spinbox.setValue(value[0]) if hasattr(self, '_max_spinbox'): self._max_spinbox.setValue(value[1]) self._boundingbox.repaint() @property def min(self): return self._boundingbox._lower @min.setter def min(self, value): self._boundingbox._lower = value self._boundingbox.repaint() if hasattr(self, '_min_spinbox'): self._min_spinbox.setMinimum(value) if hasattr(self, '_max_spinbox'): self._max_spinbox.setMinimum(value) @property def max(self): return self._boundingbox._higher @max.setter def max(self, value): self._boundingbox._higher = value self._boundingbox.repaint() if hasattr(self, '_min_spinbox'): self._min_spinbox.setMaximum(value) if hasattr(self, '_max_spinbox'): self._max_spinbox.setMaximum(value) @property def scale(self): return self._boundingbox.scale @scale.setter def scale(self, value): self._boundingbox.scale = value @property def convert_2_int(self): return not self._boundingbox._use_float @convert_2_int.setter def convert_2_int(self, value): self._boundingbox._use_float = not value
class ControlBoundingSlider(ControlBase): """ .. image:: https://raw.githubusercontent.com/UmSenhorQualquer/pyforms/master/tutorials/Controls4Docs/ControlBoundingSlider.png """ def __init__(self, *args, **kwargs): """ :param tupple default: The default value is a list containing in the first element the lower value and in the second element the upper value. Default = [20,40]. :param bool horizontal: Flag indicating if the Bounding slider should be draw horizontally or vertically. Default = True. :param bool show_spinboxes: Show or hide the spinboxes. Default = True :param float minimum: Defines the minimum value that can be selected. :param float maximum: Defines the maximum value that can be selected. :param bool convert_2_int: Flag to define if the control should return floats or integers. """ self._horizontal = kwargs.get('horizontal', True) self._show_spinboxes = kwargs.get('show_spinboxes', True) ControlBase.__init__(self, *args, **kwargs) self.min = kwargs.get('min', kwargs.get('minimum', 0)) self.max = kwargs.get('max', kwargs.get('maximum', 100)) self.value = kwargs.get('default', [10,20]) self.convert_2_int = kwargs.get('convert_2_int', False) self.__update() def init_form(self): self._boundingbox = GaugeWidgetHorizontal() if self._horizontal else GaugeWidgetVertical() self._boundingbox.changed_event = self.__update if self._show_spinboxes: self._form = hwidget = QWidget() if self._horizontal: hlayout = QHBoxLayout() else: hlayout = QVBoxLayout() if _api.USED_API == _api.QT_API_PYQT5: hlayout.setContentsMargins(0,0,0,0) elif _api.USED_API == _api.QT_API_PYQT4: hlayout.setMargin(0) if self._label is not None: self._controllabel = QLabel(self.form) hlayout.addWidget(self._controllabel) self._controllabel.setAccessibleName('ControlBoundingSlider-label') self.label = self._label else: self._controllabel = None hwidget.setLayout(hlayout) self._min_spinbox = QSpinBox() self._min_spinbox.valueChanged.connect(self.__min_spinbox_changed) self._min_spinbox.setMaximumWidth(95) self._max_spinbox = QSpinBox() self._max_spinbox.valueChanged.connect(self.__max_spinbox_changed) self._max_spinbox.setMaximumWidth(95) if self._horizontal: hlayout.addWidget(self._min_spinbox) else: hlayout.addWidget(self._max_spinbox) hlayout.addWidget(self._boundingbox) if self._horizontal: hlayout.addWidget(self._max_spinbox) else: hlayout.addWidget(self._min_spinbox) else: self._form = self._boundingbox super(ControlBoundingSlider, self).init_form() def __max_spinbox_changed(self, value): if value < self._boundingbox._minVal: return if hasattr(self, '_is_updating_spinboxes'): return self.scale = self.__find_scale_factor(value) self._boundingbox._maxVal = value self._boundingbox.repaint() self.changed_event() def __min_spinbox_changed(self, value): if value > self._boundingbox._maxVal: return if hasattr(self, '_is_updating_spinboxes'): return self.scale = self.__find_scale_factor(value) self._boundingbox._minVal = value self._boundingbox.repaint() self.changed_event() def __update(self): l, h = self._boundingbox._minVal, self._boundingbox._maxVal self._is_updating_spinboxes = True if self._show_spinboxes: self._min_spinbox.setValue(l) self._max_spinbox.setValue(h) del self._is_updating_spinboxes self.changed_event() def changed_event(self): pass def __find_scale_factor(self, value): scale = 1.0 new_value = value while abs(new_value) < 0.0: scale *= 10.0 new_value = value * scale return scale def load_form(self, data, path=None): """ Load a value from the dict variable @param data: dictionary with the value of the Control """ self.convert_2_int = data.get('convert-int', self.convert_2_int) self.scale = data.get('scale', self.scale) self.max = data.get('max', self.max) self.min = data.get('min', self.min) self.value = data.get('value', self.value) def save_form(self, data, path=None): """ Save a value to dict variable @param data: dictionary with to where the value of the Control will be added """ data['value'] = self.value data['max'] = self.max data['min'] = self.min data['scale'] = self.scale data['convert-int'] = self.convert_2_int return data ########################################################################## ############ Properties ################################################## ########################################################################## @property def label(self): return self._controllabel.getText() @label.setter def label(self, value): self._controllabel.setText(value) @property def value(self): """ Sets and gets the control value. It should be a list or tuple of 2 values. """ return self._boundingbox._minVal, self._boundingbox._maxVal @value.setter def value(self, value): self.scale = self.__find_scale_factor(value[0]) self._boundingbox._minVal, self._boundingbox._maxVal = value[0], value[1] if hasattr(self, '_min_spinbox'): self._min_spinbox.setValue(value[0]) if hasattr(self, '_max_spinbox'): self._max_spinbox.setValue(value[1]) ControlBase.value.fset(self, value) self._boundingbox.repaint() @property def min(self): """ Sets and gets the minimum value possible. """ return self._boundingbox._lower @min.setter def min(self, value): self._boundingbox._lower = value self._boundingbox.repaint() if hasattr(self, '_min_spinbox'): self._min_spinbox.setMinimum(value) if hasattr(self, '_max_spinbox'): self._max_spinbox.setMinimum(value) @property def max(self): """ Sets and gets the maximum value possible. """ return self._boundingbox._higher @max.setter def max(self, value): self._boundingbox._higher = value self._boundingbox.repaint() if hasattr(self, '_min_spinbox'): self._min_spinbox.setMaximum(value) if hasattr(self, '_max_spinbox'): self._max_spinbox.setMaximum(value) @property def scale(self): """ Sets and gets the scale value. """ return self._boundingbox.scale @scale.setter def scale(self, value): self._boundingbox.scale = value @property def convert_2_int(self): """ Flag to define if the control should return floats or integers. """ return not self._boundingbox._use_float @convert_2_int.setter def convert_2_int(self, value): self._boundingbox._use_float = not value