Today I finished a data generator tool for a custom format for a game. The idea is that PyQt6 is versatile and very useful for a developer. This tool generates data in the 2D area of a screen and saves them in a defined format, in this case a position and a size for a text ...

Here is the class for custom range selection sliders.
class RangeSlider(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self._min, self._max = 0, 1000
self._start, self._end = 0, 1000
self._dragging = None
self.setMinimumHeight(24)
def setRange(self, minimum, maximum):
self._min, self._max = minimum, maximum
self._start, self._end = minimum, maximum
self.update()
def setStart(self, val):
self._start = max(self._min, min(val, self._end))
self.update()
def setEnd(self, val):
self._end = min(self._max, max(val, self._start))
self.update()
def start(self): return self._start
def end(self): return self._end
def _pos_to_val(self, x):
w = self.width()
ratio = max(0, min(x, w)) / w if w else 0
return int(self._min + ratio*(self._max-self._min))
def _val_to_pos(self, val):
w = self.width()
return int((val-self._min)/(self._max-self._min)*w) if self._max>self._min else 0
def mousePressEvent(self, e):
x = e.position().x()
sx, ex = self._val_to_pos(self._start), self._val_to_pos(self._end)
self._dragging = "start" if abs(x-sx)<abs(x-ex) else "end"
self.mouseMoveEvent(e)
def mouseMoveEvent(self, e):
if self._dragging:
val = self._pos_to_val(int(e.position().x()))
if self._dragging=="start": self.setStart(val)
else: self.setEnd(val)
def mouseReleaseEvent(self,e): self._dragging=None
def paintEvent(self,e):
p=QPainter(self); rect=self.rect()
sx,ex=self._val_to_pos(self._start),self._val_to_pos(self._end)
p.fillRect(rect,QColor(220,220,220))
p.fillRect(QRect(QPoint(sx,0),QPoint(ex,rect.height())),QColor(100,200,100,120))
p.setBrush(QColor(50,120,200)); p.setPen(Qt.PenStyle.NoPen)
p.drawEllipse(QPoint(sx,rect.center().y()),6,6)
p.drawEllipse(QPoint(ex,rect.center().y()),6,6)