import sys
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
from PySide6.QtNetwork import *
app = QApplication(sys.argv)
win = QMainWindow()
class MySlider(QWidget):
def __init__(self,*xs,**kw):
super().__init__(*xs,**kw)
self._minimum = 0
self._maximum = 100
self._value = 40
self._marker_size = 10
def paintEvent(self,event):
with QPainter(self) as p:
rect = self.rect()
w = rect.width()
h = rect.height()
path = QPainterPath()
path.moveTo(w/2,0)
path.lineTo(w/2,h)
p.setPen(QPen(QColor.fromRgb(255,0,0),2))
p.setBrush(Qt.NoBrush)
p.drawPath(path)
path.clear
r = self._maximum-self._minimum
y = self._value / r
y = 1 - y
y = y * h
ms = self._marker_size
path.moveTo(w/2,y)
path.lineTo(w/2-ms,y-ms)
path.lineTo(w/2-ms,y+ms)
path.closeSubpath()
p.setPen(Qt.NoPen)
p.setBrush(QColor.fromRgb(255,0,0))
p.drawPath(path)
def mousePressEvent(self,event):
pos = event.position().toPoint()
x,y = pos.x(),pos.y()
self.x0 = x
self.y0 = y
def mouseMoveEvent(self,event):
rect = self.rect()
w = rect.width()
h = rect.height()
pos = event.position().toPoint()
x,y = pos.x(),pos.y()
dx = x - self.x0
dy = y - self.y0
self.x0 = x
self.y0 = y
r = self._maximum-self._minimum
dv = dy * r / h
self._value -= dv
self.clamp()
self.update()
def clamp(self):
if self._value < self._minimum:
self._value = self._minimum
if self._value > self._maximum:
self._value = self._maximum
s = MySlider()
win.setFixedSize(512,512)
win.setCentralWidget(s)
win.show()
exit(app.exec())