def mouseMoveEvent(self, event): if self.lowerPressed != QtGui.QStyle.SC_SliderHandle and self.upperPressed != QtGui.QStyle.SC_SliderHandle: event.ignore() return opt = QtGui.QStyleOptionSlider() self.initStyleOption(opt) m = self.style().pixelMetric(QtGui.QStyle.PM_MaximumDragDistance, opt, self) newPosition = self.pixelPosToRangeValue(self.pick(event.pos()) - self.offset) if m >= 0: r = self.rect().adjusted(-m, -m, m, m) if not r.contains(event.pos()): newPosition = self.position # pick the preferred handle on the first movement if self.firstMovement: # if self.lower == self.upper: # if newPosition < self.lowerValue(): # self.swapControls() # self.firstMovement = False # else: self.firstMovement = False if self.lowerPressed == QtGui.QStyle.SC_SliderHandle: newPosition = min(newPosition, self.upper) self.setLowerPosition(newPosition) elif self.upperPressed == QtGui.QStyle.SC_SliderHandle: newPosition = max(newPosition, self.lower) self.setUpperPosition(newPosition) event.accept()
def handleMousePress(self, pos, control, value, handle): opt = QtGui.QStyleOptionSlider() self._initStyleOption(opt, handle) oldControl = control control = self.style().hitTestComplexControl(QtGui.QStyle.CC_Slider, opt, pos, self) sr = self.style().subControlRect(QtGui.QStyle.CC_Slider, opt, QtGui.QStyle.SC_SliderHandle, self) if control == QtGui.QStyle.SC_SliderHandle: self.position = value self.offset = self.pick(pos - sr.topLeft()) self.lastPressed = handle self.setSliderDown(True) # self.sliderPressed.emit(handle) self.emit(QtCore.SIGNAL("sliderPressed(PyQt_PyObject)"), handle) if control != oldControl: self.update(sr) return control
def pixelPosToRangeValue(self, pos): opt = QtGui.QStyleOptionSlider() self.initStyleOption(opt) sliderMin = 0 sliderMax = 0 sliderLength = 0 gr = self.style().subControlRect(QtGui.QStyle.CC_Slider, opt, QtGui.QStyle.SC_SliderGroove, self) sr = self.style().subControlRect(QtGui.QStyle.CC_Slider, opt, QtGui.QStyle.SC_SliderHandle, self) if self.orientation() == QtCore.Qt.Horizontal: sliderLength = sr.width() sliderMin = gr.x() sliderMax = gr.right() - sliderLength + 1 else: sliderLength = sr.height() sliderMin = gr.y() sliderMax = gr.bottom() - sliderLength + 1 return QtGui.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), pos - sliderMin, sliderMax - sliderMin, opt.upsideDown)
def drawHandle(self, painter, handle): opt = QtGui.QStyleOptionSlider() self._initStyleOption(opt, handle) opt.subControls = QtGui.QStyle.SC_SliderHandle # if handle == QSpanSlider.LowerHandle: # print "LowerHandle (",self.lowerPressed,")" # elif handle == QSpanSlider.UpperHandle: # print "UpperHandle (",self.upperPressed,")" # else: # print "NoHandle" pressed = self.upperPressed if handle == QSpanSlider.LowerHandle: pressed = self.lowerPressed if pressed == QtGui.QStyle.SC_SliderHandle: opt.activeSubControls = pressed opt.state |= QtGui.QStyle.State_Sunken painter.drawComplexControl(QtGui.QStyle.CC_Slider, opt)
def paintEvent(self, event): painter = QtGui.QStylePainter(self) # ticks opt = QtGui.QStyleOptionSlider() self.initStyleOption(opt) # opt.subControls = QtGui.QStyle.SC_SliderTickmarks painter.drawComplexControl(QtGui.QStyle.CC_Slider, opt) # groove opt.sliderPosition = 20 opt.sliderValue = 0 opt.subControls = QtGui.QStyle.SC_SliderGroove painter.drawComplexControl(QtGui.QStyle.CC_Slider, opt) # handle rects opt.sliderPosition = self.lowerPos lr = self.style().subControlRect(QtGui.QStyle.CC_Slider, opt, QtGui.QStyle.SC_SliderHandle, self) lrv = self.pick(lr.center()) opt.sliderPosition = self.upperPos ur = self.style().subControlRect(QtGui.QStyle.CC_Slider, opt, QtGui.QStyle.SC_SliderHandle, self) urv = self.pick(ur.center()) # span minv = min(lrv, urv) maxv = max(lrv, urv) c = self.style().subControlRect(QtGui.QStyle.CC_Slider, opt, QtGui.QStyle.SC_SliderGroove, self).center() spanRect = QtCore.QRect(QtCore.QPoint(c.x() - 2, minv), QtCore.QPoint(c.x() + 1, maxv)) if self.orientation() == QtCore.Qt.Horizontal: spanRect = QtCore.QRect(QtCore.QPoint(minv, c.y() - 2), QtCore.QPoint(maxv, c.y() + 1)) self.drawSpan(painter, spanRect) # handles if self.lastPressed == QSpanSlider.LowerHandle: self.drawHandle(painter, QSpanSlider.UpperHandle) self.drawHandle(painter, QSpanSlider.LowerHandle) else: self.drawHandle(painter, QSpanSlider.LowerHandle) self.drawHandle(painter, QSpanSlider.UpperHandle)
def drawSpan(self, painter, rect): opt = QtGui.QStyleOptionSlider() QtGui.QSlider.initStyleOption(self, opt) # area groove = self.style().subControlRect(QtGui.QStyle.CC_Slider, opt, QtGui.QStyle.SC_SliderGroove, self) if opt.orientation == QtCore.Qt.Horizontal: groove.adjust(0, 0, -1, 0) else: groove.adjust(0, 0, 0, -1) # pen & brush painter.setPen(QtGui.QPen(self.gradientLeft, 0)) if opt.orientation == QtCore.Qt.Horizontal: self.setupPainter(painter, opt.orientation, groove.center().x(), groove.top(), groove.center().x(), groove.bottom()) else: self.setupPainter(painter, opt.orientation, groove.left(), groove.center().y(), groove.right(), groove.center().y()) # draw groove intersected = QtCore.QRectF(rect.intersected(groove)) gradient = QtGui.QLinearGradient(intersected.topLeft(), intersected.topRight()) gradient.setColorAt(0, self.gradientLeft) gradient.setColorAt(1, self.gradientRight) painter.fillRect(intersected, gradient)