|
| 1 | +#!/usr/bin/env python |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | + |
| 4 | +""" |
| 5 | +Created on 2019年1月31日 |
| 6 | +@author: Irony |
| 7 | +@site: https://pyqt5.com https://github.com/892768447 |
| 8 | +@email: 892768447@qq.com |
| 9 | +@file: Utils.GradientUtils |
| 10 | +@description: 渐变颜色工具类 |
| 11 | +""" |
| 12 | +from PyQt5.QtGui import QGradient, QColor |
| 13 | + |
| 14 | + |
| 15 | +__Author__ = 'Irony' |
| 16 | +__Copyright__ = 'Copyright (c) 2019' |
| 17 | + |
| 18 | + |
| 19 | +class GradientUtils: |
| 20 | + |
| 21 | + @classmethod |
| 22 | + def _getValue(cls, value): |
| 23 | + """把大范围的数字转成小范围 |
| 24 | + :param cls: |
| 25 | + :param value: |
| 26 | + """ |
| 27 | + length = len(str(int(value))) |
| 28 | + if length == 1: |
| 29 | + return value |
| 30 | + if length > 2: |
| 31 | + length = 2 |
| 32 | + value = value % 100 |
| 33 | + return value / (10**length) |
| 34 | + |
| 35 | + @classmethod |
| 36 | + def _styleSheetParameters(cls, gradient): |
| 37 | + result = [] |
| 38 | + |
| 39 | + if gradient.type() != QGradient.ConicalGradient: |
| 40 | + if gradient.spread() == QGradient.PadSpread: |
| 41 | + result.append('spread:pad') |
| 42 | + elif gradient.spread() == QGradient.ReflectSpread: |
| 43 | + result.append('spread:reflect') |
| 44 | + elif gradient.spread() == QGradient.RepeatSpread: |
| 45 | + result.append('spread:repeat') |
| 46 | + else: |
| 47 | + print('GradientUtils::_styleSheetParameters(): gradient spread ', |
| 48 | + gradient.spread(), ' not supported!') |
| 49 | + result.append('') |
| 50 | + |
| 51 | + if gradient.type() == QGradient.LinearGradient: |
| 52 | + result.append('x1:%s' % gradient.start().x()) |
| 53 | + result.append('y1:%s' % gradient.start().y()) |
| 54 | + if hasattr(gradient, 'ex'): |
| 55 | + result.append('x2:%s' % gradient.ex) |
| 56 | + else: |
| 57 | + result.append('x2:%s' % gradient.finalStop().x()) |
| 58 | + if hasattr(gradient, 'ey'): |
| 59 | + result.append('y2:%s' % gradient.ey) |
| 60 | + else: |
| 61 | + result.append('y2:%s' % gradient.finalStop().y()) |
| 62 | + elif gradient.type() == QGradient.RadialGradient: |
| 63 | + result.append('cx:%s' % gradient.center().x()) |
| 64 | + result.append('cy:%s' % gradient.center().y()) |
| 65 | + result.append('radius:%s' % gradient.radius()) |
| 66 | + result.append('fx:%s' % gradient.focalPoint().x()) |
| 67 | + result.append('fy:%s' % gradient.focalPoint().y()) |
| 68 | + elif gradient.type() == QGradient.ConicalGradient: |
| 69 | + result.append('cx:%s' % gradient.center().x()) |
| 70 | + result.append('cy:%s' % gradient.center().y()) |
| 71 | + result.append('angle:%s' % gradient.angle()) |
| 72 | + else: |
| 73 | + print('GradientUtils::_styleSheetParameters(): gradient type ', |
| 74 | + gradient.type(), ' not supported!') |
| 75 | + |
| 76 | + return result |
| 77 | + |
| 78 | + @classmethod |
| 79 | + def _styleSheetStops(cls, gradient): |
| 80 | + result = [] |
| 81 | + |
| 82 | + for stop, color in gradient.stops(): |
| 83 | + result.append('stop:{} rgba({}, {}, {}, {})'.format( |
| 84 | + stop, color.red(), color.green(), color.blue(), color.alpha())) |
| 85 | + |
| 86 | + return result |
| 87 | + |
| 88 | + @classmethod |
| 89 | + def _styleSheetFillName(cls, gradient): |
| 90 | + if gradient.type() == QGradient.LinearGradient: |
| 91 | + return 'qlineargradient' |
| 92 | + elif gradient.type() == QGradient.RadialGradient: |
| 93 | + return 'qradialgradient' |
| 94 | + elif gradient.type() == QGradient.ConicalGradient: |
| 95 | + return 'qconicalgradient' |
| 96 | + else: |
| 97 | + print('GradientUtils::_styleSheetFillName(): gradient type ', |
| 98 | + gradient.type(), ' not supported!') |
| 99 | + return '' |
| 100 | + |
| 101 | + @classmethod |
| 102 | + def styleSheetCode(cls, colorgradient): |
| 103 | + """颜色或渐变转字符串 |
| 104 | + :param cls: |
| 105 | + :param gradient: |
| 106 | + """ |
| 107 | + if isinstance(colorgradient, QColor): |
| 108 | + return 'rgba({}, {}, {}, {})'.format( |
| 109 | + colorgradient.red(), colorgradient.green(), |
| 110 | + colorgradient.blue(), colorgradient.alpha()) |
| 111 | + gradientParameters = cls._styleSheetParameters( |
| 112 | + colorgradient) + cls._styleSheetStops(colorgradient) |
| 113 | + return cls._styleSheetFillName(colorgradient) + '(' + ', '.join(gradientParameters) + ')' |
0 commit comments