```python 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()) ``` ## PyQt6 Here is the same example adapted to [PyQt6](/aw/dev/qt/PyQt6). Only minor changes were needed. ```python import sys from PyQt6.QtCore import * from PyQt6.QtGui import * from PyQt6.QtWidgets import * from PyQt6.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.BrushStyle.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.PenStyle.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()) ``` ## The diff ```diff 2,5c2,5 < from PyQt6.QtCore import * < from PyQt6.QtGui import * < from PyQt6.QtWidgets import * < from PyQt6.QtNetwork import * --- > from PySide6.QtCore import * > from PySide6.QtGui import * > from PySide6.QtWidgets import * > from PySide6.QtNetwork import * 26c26 < p.setBrush(Qt.BrushStyle.NoBrush) --- > p.setBrush(Qt.NoBrush) 38c38 < p.setPen(Qt.PenStyle.NoPen) --- > p.setPen(Qt.NoPen) ```