def __init__(self): QtGui.QWidget.__init__(self) self.start_spinbox = QtGui.QSpinBox() self.end_spinbox = QtGui.QSpinBox() self.slider = QSpanSlider(QtCore.Qt.Horizontal) # Fill background to avoid to see text or widget behind self.setAutoFillBackground(True) AbstractIntRangeWidget.__init__(self) # To be compatible with tree or table views, slider must keep focus self.slider.setFocusPolicy(QtCore.Qt.StrongFocus) self.setMinimumHeight(22) self.start_spinbox.setMinimumHeight(18) self.end_spinbox.setMinimumHeight(18) self.slider.setMinimumHeight(18) self.slider.lowerPositionChanged.connect(self.start_spinbox.setValue) self.slider.lowerPositionChanged.connect(self.end_spinbox.setMinimum) self.slider.upperPositionChanged.connect(self.end_spinbox.setValue) self.slider.upperPositionChanged.connect(self.start_spinbox.setMaximum) self.start_spinbox.valueChanged.connect(self.slider.setLowerValue) self.end_spinbox.valueChanged.connect(self.slider.setUpperValue) self.start_spinbox.valueChanged.connect(self.end_spinbox.setMinimum) self.end_spinbox.valueChanged.connect(self.start_spinbox.setMaximum) self.start_spinbox.valueChanged.connect( self.notify_start_value_changed) self.end_spinbox.valueChanged.connect(self.notify_end_value_changed) self.slider.spanChanged.connect(self.notify_value_changed) layout = QtGui.QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.start_spinbox) layout.addWidget(self.slider) layout.addWidget(self.end_spinbox) self.value_changed_signal = self.valueChanged