一、效果图
二、获取方式
源码可以在Github上下载,后续会不断更新,并且提供C++版本组件,欢迎各位关注。
- Github :https://github.com/Rev-RoastedDuck/Qt-RoastedDuck-Widgets.git
- 视频主页:https://space.bilibili.com/439475163/video
- CSDN主页:https://blog.csdn.net/m0_72760466
三、声明
本文使用了遵循GPLv3许可证的开源代码-Qt-RoastedDuck-Widgets,以下代码遵循GPLv3许可证。
四、核心代码
class Silder(SilderBase):
def __init__(self, orientation: Qt.Orientation, parent=None, ):
super().__init__(orientation, parent=parent)
self.__paramsConfig()
def __paramsConfig(self):
# 颜色
self.__color_groove_add = QColor(231, 227, 228)
self.__color_groove_sub = QColor(148, 59, 142)
self.__color_handle_outside = QColor(QColor(255, 255, 255))
self.__color_handle_inside = QColor(QColor(148, 59, 142))
# 线宽
self.__width_line = 6
# padding
self.__padding = 15
# handle 半径
self.radius_handle = 10
def __paintGroove(self, painter: QPainter):
painter.save()
pen = QPen()
pen.setCapStyle(Qt.RoundCap)
pen.setWidth(self.__width_line)
pen.setColor(self.__color_groove_add)
painter.setPen(pen)
if self.orientation() == Qt.Orientation.Horizontal:
painter.drawLine(QPoint(self.__padding, self.__padding),
QPoint(self.width() - self.__padding * 2, self.__padding))
else:
painter.drawLine(QPoint(self.__padding, self.height() - self.__padding * 2),
QPoint(self.__padding, self.__padding))
if self.value():
args = self.width() if self.orientation() == Qt.Orientation.Horizontal else self.height()
xy = int(((args - self.__padding * 2) / (self.maximum() - self.minimum())) * (self.value() - self.minimum()) + self.__padding)
xy = xy if xy <= args - self.__padding else args - self.__padding
pen.setColor(self.__color_groove_sub)
painter.setPen(pen)
if self.orientation() == Qt.Orientation.Horizontal:
painter.drawLine(QPoint(self.__padding, self.__padding), QPoint(xy, self.__padding))
else:
painter.drawLine(QPoint(self.__padding, self.__padding),QPoint(self.__padding, xy))
painter.restore()
def __paintHandle(self, painter: QPainter):
painter.save()
point = self.__getHandlePos()
if self.__is_hovering_handle:
radius_big = self.radius_handle + 3
radius_little = int(self.radius_handle * 0.6)
else:
radius_big = self.radius_handle
radius_little = int(self.radius_handle * 0.6)
# 外圆部分
painter.setBrush(self.__color_handle_outside)
painter.drawEllipse(point, radius_big, radius_big)
# 内圆部分
painter.setBrush(self.__color_handle_inside)
painter.drawEllipse(point, radius_little, radius_little)
painter.restore()