Beispiel #1
0
    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()
Beispiel #2
0
    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
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
    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)
Beispiel #6
0
    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)