lang/pysideex/ PaintingSimpleSlider1


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())