Wip style QSlider
This commit is contained in:
272
slidergroovecolorstyle.py
Normal file
272
slidergroovecolorstyle.py
Normal file
@@ -0,0 +1,272 @@
|
||||
from PyQt6.QtCore import Qt
|
||||
from PyQt6.QtWidgets import (
|
||||
QSlider, QProxyStyle, QStyle
|
||||
)
|
||||
from PyQt6.QtGui import QColor
|
||||
|
||||
class SliderGrooveColorStyle(QProxyStyle):
|
||||
def __init__(self, base_style=None, groove_color=QColor("lightblue")):
|
||||
super().__init__(base_style)
|
||||
self.groove_color = groove_color
|
||||
|
||||
def drawComplexControl(self, control, option, painter, widget=None):
|
||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
||||
|
||||
# Récupérer la zone du groove
|
||||
groove_rect = self.subControlRect(
|
||||
QStyle.ComplexControl.CC_Slider,
|
||||
option,
|
||||
QStyle.SubControl.SC_SliderGroove,
|
||||
widget
|
||||
)
|
||||
|
||||
# Dessiner notre fond
|
||||
painter.save()
|
||||
painter.setBrush(self.groove_color)
|
||||
painter.setPen(Qt.PenStyle.NoPen)
|
||||
painter.drawRect(groove_rect)
|
||||
painter.restore()
|
||||
|
||||
# Puis laisser Qt dessiner normalement (handle etc.)
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
return
|
||||
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
|
||||
class SliderSubPageColorStyle(QProxyStyle):
|
||||
def __init__(self, base_style=None, color=QColor("#4CAF50")):
|
||||
super().__init__(base_style)
|
||||
self.color = color
|
||||
|
||||
def drawComplexControl(self, control, option, painter, widget=None):
|
||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
||||
|
||||
# Laisser Qt dessiner le slider normalement
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
|
||||
# Récupérer les rectangles du groove et du handle
|
||||
groove_rect = self.subControlRect(
|
||||
control,
|
||||
option,
|
||||
QStyle.SubControl.SC_SliderGroove,
|
||||
widget
|
||||
)
|
||||
|
||||
handle_rect = self.subControlRect(
|
||||
control,
|
||||
option,
|
||||
QStyle.SubControl.SC_SliderHandle,
|
||||
widget
|
||||
)
|
||||
|
||||
painter.save()
|
||||
painter.setBrush(self.color)
|
||||
painter.setPen(Qt.PenStyle.NoPen)
|
||||
|
||||
if widget.orientation() == Qt.Orientation.Horizontal:
|
||||
# Partie avant le handle (gauche → centre du handle)
|
||||
sub_rect = groove_rect.adjusted(
|
||||
0,
|
||||
0,
|
||||
handle_rect.center().x() - groove_rect.right(),
|
||||
0
|
||||
)
|
||||
else:
|
||||
# Vertical (bas → centre du handle)
|
||||
sub_rect = groove_rect.adjusted(
|
||||
0,
|
||||
handle_rect.center().y() - groove_rect.bottom(),
|
||||
0,
|
||||
0
|
||||
)
|
||||
|
||||
painter.drawRect(sub_rect)
|
||||
painter.restore()
|
||||
|
||||
return
|
||||
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
|
||||
class SliderAddPageColorStyle(QProxyStyle):
|
||||
def __init__(self, base_style=None, color=QColor("#FF9800")):
|
||||
super().__init__(base_style)
|
||||
self.color = color
|
||||
|
||||
def drawComplexControl(self, control, option, painter, widget=None):
|
||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
||||
|
||||
# Récupérer groove + handle
|
||||
groove_rect = self.subControlRect(
|
||||
control,
|
||||
option,
|
||||
QStyle.SubControl.SC_SliderGroove,
|
||||
widget
|
||||
)
|
||||
|
||||
handle_rect = self.subControlRect(
|
||||
control,
|
||||
option,
|
||||
QStyle.SubControl.SC_SliderHandle,
|
||||
widget
|
||||
)
|
||||
|
||||
painter.save()
|
||||
painter.setBrush(self.color)
|
||||
painter.setPen(Qt.PenStyle.NoPen)
|
||||
|
||||
if widget.orientation() == Qt.Orientation.Horizontal:
|
||||
# Partie après le handle (centre → fin)
|
||||
add_rect = groove_rect.adjusted(
|
||||
handle_rect.center().x() - groove_rect.left(),
|
||||
0,
|
||||
0,
|
||||
0
|
||||
)
|
||||
else:
|
||||
# Vertical (centre → haut)
|
||||
add_rect = groove_rect.adjusted(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
handle_rect.center().y() - groove_rect.top()
|
||||
)
|
||||
|
||||
painter.drawRect(add_rect)
|
||||
painter.restore()
|
||||
|
||||
# IMPORTANT : Qt dessine ensuite le handle par-dessus
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
return
|
||||
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
|
||||
class ThinAddPageLineStyle(QProxyStyle):
|
||||
def __init__(self, base_style=None, color=QColor("#E91E63")):
|
||||
super().__init__(base_style)
|
||||
self.color = color
|
||||
|
||||
def drawComplexControl(self, control, option, painter, widget=None):
|
||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
||||
|
||||
groove_rect = self.subControlRect(
|
||||
control,
|
||||
option,
|
||||
QStyle.SubControl.SC_SliderGroove,
|
||||
widget
|
||||
)
|
||||
|
||||
handle_rect = self.subControlRect(
|
||||
control,
|
||||
option,
|
||||
QStyle.SubControl.SC_SliderHandle,
|
||||
widget
|
||||
)
|
||||
|
||||
painter.save()
|
||||
painter.setBrush(self.color)
|
||||
painter.setPen(Qt.PenStyle.NoPen)
|
||||
|
||||
if widget.orientation() == Qt.Orientation.Horizontal:
|
||||
# Épaisseur fine (2 px)
|
||||
thickness = 2
|
||||
|
||||
y = groove_rect.center().y() - thickness // 2
|
||||
|
||||
add_rect = groove_rect.adjusted(
|
||||
handle_rect.center().x() - groove_rect.left(),
|
||||
0,
|
||||
0,
|
||||
0
|
||||
)
|
||||
|
||||
add_rect.setTop(y)
|
||||
add_rect.setHeight(thickness)
|
||||
|
||||
else:
|
||||
thickness = 2
|
||||
|
||||
x = groove_rect.center().x() - thickness // 2
|
||||
|
||||
add_rect = groove_rect.adjusted(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
handle_rect.center().y() - groove_rect.top()
|
||||
)
|
||||
|
||||
add_rect.setLeft(x)
|
||||
add_rect.setWidth(thickness)
|
||||
|
||||
painter.drawRect(add_rect)
|
||||
painter.restore()
|
||||
|
||||
# Dessiner ensuite le slider normalement (handle au-dessus)
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
return
|
||||
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
|
||||
class ThinSubPageLineStyle(QProxyStyle):
|
||||
def __init__(self, base_style=None, color=QColor("#4CAF50")):
|
||||
super().__init__(base_style)
|
||||
self.color = color
|
||||
|
||||
def drawComplexControl(self, control, option, painter, widget=None):
|
||||
if control == QStyle.ComplexControl.CC_Slider and isinstance(widget, QSlider):
|
||||
|
||||
groove_rect = self.subControlRect(
|
||||
control,
|
||||
option,
|
||||
QStyle.SubControl.SC_SliderGroove,
|
||||
widget
|
||||
)
|
||||
|
||||
handle_rect = self.subControlRect(
|
||||
control,
|
||||
option,
|
||||
QStyle.SubControl.SC_SliderHandle,
|
||||
widget
|
||||
)
|
||||
|
||||
painter.save()
|
||||
painter.setBrush(self.color)
|
||||
painter.setPen(Qt.PenStyle.NoPen)
|
||||
|
||||
# Épaisseur fine (ajuste si besoin)
|
||||
thickness = 2
|
||||
|
||||
if widget.orientation() == Qt.Orientation.Horizontal:
|
||||
|
||||
y = groove_rect.center().y() - thickness // 2
|
||||
|
||||
sub_rect = groove_rect.adjusted(
|
||||
0,
|
||||
0,
|
||||
handle_rect.center().x() - groove_rect.right(),
|
||||
0
|
||||
)
|
||||
|
||||
sub_rect.setTop(y)
|
||||
sub_rect.setHeight(thickness)
|
||||
|
||||
else:
|
||||
x = groove_rect.center().x() - thickness // 2
|
||||
|
||||
sub_rect = groove_rect.adjusted(
|
||||
0,
|
||||
handle_rect.center().y() - groove_rect.bottom(),
|
||||
0,
|
||||
0
|
||||
)
|
||||
|
||||
sub_rect.setLeft(x)
|
||||
sub_rect.setWidth(thickness)
|
||||
|
||||
painter.drawRect(sub_rect)
|
||||
painter.restore()
|
||||
|
||||
# Qt redessine le slider (handle au-dessus)
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
return
|
||||
|
||||
super().drawComplexControl(control, option, painter, widget)
|
||||
Reference in New Issue
Block a user