Source code for ArrayViewer.Slider

"""
# Create a custom Slider with minimum and maximum for the color values.
# Author: Alex Schwarz <alex.schwarz@informatik.tu-chemnitz.de>
"""
import sys
from PyQt5 import QtCore, QtWidgets


[docs]class rangeSlider(QtWidgets.QWidget): """ Combination of two sliders that return a range tuple """ sliderReleased = QtCore.pyqtSignal() def __init__(self, parent=None, minmax=(0, 1)): """ Initialize the Slider """ super(rangeSlider, self).__init__(parent) # Set internal variables self._nSteps = 100 self._minVal = minmax[0] self._scaling = 1.0 * (minmax[1] - minmax[0]) / self._nSteps # Setup the (sub-)widgets self.minSlide = QtWidgets.QSlider(self) self.maxSlide = QtWidgets.QSlider(self) self.minSlide.setRange(0, self._nSteps) self.maxSlide.setRange(0, self._nSteps) self.minSlide.setTickPosition(self.minSlide.TicksRight) self.maxSlide.setTickPosition(self.maxSlide.TicksLeft) self.set_enabled(False) self.minSlide.setSingleStep(1) self.maxSlide.setSingleStep(1) self.minSlide.setTickInterval(self._nSteps / 10) self.maxSlide.setTickInterval(self._nSteps / 10) self.minSlide.valueChanged.connect(self._min_restict) self.maxSlide.valueChanged.connect(self._max_restict) self.Layout = QtWidgets.QHBoxLayout(self) self.Layout.setSpacing(0) self.Layout.addWidget(self.minSlide) self.Layout.addWidget(self.maxSlide) # Signals self.minSlide.sliderReleased.connect(self.sliderReleased.emit) self.maxSlide.sliderReleased.connect(self.sliderReleased.emit) def _max_restict(self, value): """ Restricts the maximum slider to be more than the minimum slider """ if value < self.minSlide.value() + 1: self.maxSlide.setSliderPosition(self.minSlide.value() + 1) def _min_restict(self, value): """ Restricts the minimum slider to be less than the maximum slider """ if value > self.maxSlide.value() - 1: self.minSlide.setSliderPosition(self.maxSlide.value() - 1)
[docs] def print_val(self): """ Prints the tuple of the current value of both sliders """ print(self.value())
[docs] def set_enabled(self, status): """ Enable/Disable the slider. """ self.minSlide.setSliderPosition(0) self.maxSlide.setSliderPosition(self._nSteps) self.minSlide.setEnabled(status) self.maxSlide.setEnabled(status)
[docs] @QtCore.pyqtSlot() def value(self): """ Returns a tuple of the current value of both sliders """ return (self.minSlide.value() * self._scaling + self._minVal, self.maxSlide.value() * self._scaling + self._minVal)
if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QMainWindow() window.resize(100, 600) window.setWindowTitle("") CWgt = QtWidgets.QWidget(window) window.setCentralWidget(CWgt) QFra = QtWidgets.QVBoxLayout(CWgt) rangeSld = rangeSlider(window, [-1, 1]) QFra.addWidget(rangeSld) pushBtn = QtWidgets.QPushButton() rangeSld.sliderReleased.connect(rangeSld.print_val) rangeSld.set_enabled(True) QFra.addWidget(pushBtn) window.show() app.exec_()