QT6 源,十章绘图(6)画刷 QBrush 的渐变填充基类 QGradient :成员函数与源代码

(1) QPainter 绘图的时候,需要指定填充方式,代码上以 QBrush 封装。其中可以采用线条填充、点阵填充、图案填充,还可以采用渐变填充,由以下的构造函数引入

在这里插入图片描述

++本渐变类是和 QBrush 定义在同一个源文件的

(2)本类的继承关系如下

在这里插入图片描述

(3)以线性渐变为例,给出最基本的举例线性渐变没有扩充有用的代码,主要还是使用基类 QGradient 提供的功能,以此来了解 QGradient

在这里插入图片描述

++引入渐变里的扩展填充

在这里插入图片描述

++

在这里插入图片描述

++

在这里插入图片描述

++

在这里插入图片描述

++

在这里插入图片描述

++ 测试辐射渐变

在这里插入图片描述

(4)渐变类型

在这里插入图片描述

(5)

在这里插入图片描述

(6)

在这里插入图片描述

++ 看看该网址,https://webgradients.com

在这里插入图片描述

(7)

在这里插入图片描述

(8)渐变的坐标系设置

在这里插入图片描述

++以上的举例,都是采用逻辑全局坐标系,下面尝试用被绘制对象自身的坐标系来生成渐变

在这里插入图片描述

++以及

在这里插入图片描述

++ 至此, 基类的代码学习完毕,就以上这些,不多

(9)给出 QGradient 的源代码

/*******************************************************************************
 * QGradients
 */
class QGradientPrivate;

/*
The QGradient class is used in combination with QBrush to specify gradient fills. :

Detailed Description :
Qt 目前支持三种类型的渐变填充:
    *线性渐变在起始点和结束点之间插值颜色。
    *简单径向渐变在圆周上从焦点到周围圆上的端点之间插值颜色。
    *扩展径向渐变在中心和焦点圆之间插值颜色。
    *锥形渐变在中心点周围插值颜色。

可以通过type()函数获取渐变的类型。每个类型都由QGradient的一个子类表示。

渐变中的颜色是通过 QGradientStop 类型的停止点来定义的;即,一个位置和一种颜色。
使用setColorAt()函数来定义单个停止点。
或者,使用setStops()函数一次性定义多个停止点。请注意,后一种函数会替换当前的所有停止点。

正是渐变色的完整停止点集(可通过、stops()函数访问)描述了渐变区域应如何填充。
如果未指定任何停止点,将使用从0到1的黑色渐变。

从黑色到白色(在(100,100)到(200,200)之间)的对角线线性渐变可以这样指定:
    QLinearGradient linearGrad(QPointF(100, 100), QPointF(200, 200));
    linearGrad.setColorAt(0, Qt::black);
    linearGrad.setColorAt(1, Qt::white);

渐变可以具有任意数量的停止点。
以下代码将创建一种径向渐变,从中心开始为红色,边缘依次为蓝色和绿色:
    QRadialGradient radialGrad(QPointF(100, 100), 100);
    radialGrad.setColorAt(0  , Qt::red  );
    radialGrad.setColorAt(0.5, Qt::blue );
    radialGrad.setColorAt(1  , Qt::green);

通过使用`setSpread()、函数指定扩展方法,可以在其区域外重复或反映渐变效果。
默认情况下,会在外部区域填充最接近停止点的颜色。
当前设置的扩展方法可以通过spread()函数来获取。`QGradient::Spread`枚举定义了三种不同的方法.

请注意,setSpread()函数仅对线性渐变和径向渐变有效。
这是因为圆锥形渐变在定义上就是闭合的,即圆锥形渐变从0度到360度填充整个圆圈,
而径向渐变或线性渐变的边界则可以通过其半径或最终的停止点来指定。

渐变坐标可以逻辑坐标、相对于设备坐标或相对于对象限界框坐标来指定。
坐标模式可以使用setCoordinateMode()函数来设置。默认值为 LogicalMode,
其中梯度坐标的指定方式与对象坐标相同。要检索当前设置的坐标模式,请使用coordinateMode()。

*/

typedef QPair<qreal, QColor> QGradientStop;
typedef QList<QGradientStop> QGradientStops; //一个颜色列表

class Q_GUI_EXPORT QGradient
{
    Q_GADGET

private:
    QGradientData     m_data ;                          //记录渐变填充的几何坐标区域
    QGradientStops    m_stops;                          //定义在上,保存颜色插值对(位置与颜色)
    Type              m_type              = NoGradient; //渐变类型,无、线性、辐射、锥形
    Spread            m_spread            = PadSpread;
    CoordinateMode    m_coordinateMode    = LogicalMode;
    InterpolationMode m_interpolationMode = ColorInterpolation;

    friend class QLinearGradient;
    friend class QRadialGradient;
    friend class QConicalGradient;
    friend class QBrush;

public:
    union QGradientData {  //无官方注释
        struct { qreal x1, y1, x2, y2;                   } linear ;
        struct { qreal cx, cy, fx, fy, cradius, fradius; } radial ;
        struct { qreal cx, cy, angle;                    } conical;
    };


    enum Preset { //此枚举定义了一组基于https://webgradients.com/上的渐变的预设QGradient。
        WarmFlame = 1,   //庆幸的是没有官方注释
        NightFade = 2,
        SpringWarmth = 3,
        JuicyPeach = 4,
        YoungPassion = 5,
        LadyLips = 6,
        SunnyMorning = 7,
        RainyAshville = 8,
        FrozenDreams = 9,
        WinterNeva = 10,
        DustyGrass = 11,
        TemptingAzure = 12,
        HeavyRain = 13,
        AmyCrisp = 14,
        MeanFruit = 15,
        DeepBlue = 16,
        RipeMalinka = 17,
        CloudyKnoxville = 18,
        MalibuBeach = 19,
        NewLife = 20,
        TrueSunset = 21,
        MorpheusDen = 22,
        RareWind = 23,
        NearMoon = 24,
        WildApple = 25,
        SaintPetersburg = 26,
        PlumPlate = 28,
        EverlastingSky = 29,
        HappyFisher = 30,
        Blessing = 31,
        SharpeyeEagle = 32,
        LadogaBottom = 33,
        LemonGate = 34,
        ItmeoBranding = 35,
        ZeusMiracle = 36,
        OldHat = 37,
        StarWine = 38,
        HappyAcid = 41,
        AwesomePine = 42,
        NewYork = 43,
        ShyRainbow = 44,
        MixedHopes = 46,
        FlyHigh = 47,
        StrongBliss = 48,
        FreshMilk = 49,
        SnowAgain = 50,
        FebruaryInk = 51,
        KindSteel = 52,
        SoftGrass = 53,
        GrownEarly = 54,
        SharpBlues = 55,
        ShadyWater = 56,
        DirtyBeauty = 57,
        GreatWhale = 58,
        TeenNotebook = 59,
        PoliteRumors = 60,
        SweetPeriod = 61,
        WideMatrix = 62,
        SoftCherish = 63,
        RedSalvation = 64,
        BurningSpring = 65,
        NightParty = 66,
        SkyGlider = 67,
        HeavenPeach = 68,
        PurpleDivision = 69,
        AquaSplash = 70,
        SpikyNaga = 72,
        LoveKiss = 73,
        CleanMirror = 75,
        PremiumDark = 76,
        ColdEvening = 77,
        CochitiLake = 78,
        SummerGames = 79,
        PassionateBed = 80,
        MountainRock = 81,
        DesertHump = 82,
        JungleDay = 83,
        PhoenixStart = 84,
        OctoberSilence = 85,
        FarawayRiver = 86,
        AlchemistLab = 87,
        OverSun = 88,
        PremiumWhite = 89,
        MarsParty = 90,
        EternalConstance = 91,
        JapanBlush = 92,
        SmilingRain = 93,
        CloudyApple = 94,
        BigMango = 95,
        HealthyWater = 96,
        AmourAmour = 97,
        RiskyConcrete = 98,
        StrongStick = 99,
        ViciousStance = 100,
        PaloAlto = 101,
        HappyMemories = 102,
        MidnightBloom = 103,
        Crystalline = 104,
        PartyBliss = 106,
        ConfidentCloud = 107,
        LeCocktail = 108,
        RiverCity = 109,
        FrozenBerry = 110,
        ChildCare = 112,
        FlyingLemon = 113,
        NewRetrowave = 114,
        HiddenJaguar = 115,
        AboveTheSky = 116,
        Nega = 117,
        DenseWater = 118,
        Seashore = 120,
        MarbleWall = 121,
        CheerfulCaramel = 122,
        NightSky = 123,
        MagicLake = 124,
        YoungGrass = 125,
        ColorfulPeach = 126,
        GentleCare = 127,
        PlumBath = 128,
        HappyUnicorn = 129,
        AfricanField = 131,
        SolidStone = 132,
        OrangeJuice = 133,
        GlassWater = 134,
        NorthMiracle = 136,
        FruitBlend = 137,
        MillenniumPine = 138,
        HighFlight = 139,
        MoleHall = 140,
        SpaceShift = 142,
        ForestInei = 143,
        RoyalGarden = 144,
        RichMetal = 145,
        JuicyCake = 146,
        SmartIndigo = 147,
        SandStrike = 148,
        NorseBeauty = 149,
        AquaGuidance = 150,
        SunVeggie = 151,
        SeaLord = 152,
        BlackSea = 153,
        GrassShampoo = 154,
        LandingAircraft = 155,
        WitchDance = 156,
        SleeplessNight = 157,
        AngelCare = 158,
        CrystalRiver = 159,
        SoftLipstick = 160,
        SaltMountain = 161,
        PerfectWhite = 162,
        FreshOasis = 163,
        StrictNovember = 164,
        MorningSalad = 165,
        DeepRelief = 166,
        SeaStrike = 167,
        NightCall = 168,
        SupremeSky = 169,
        LightBlue = 170,
        MindCrawl = 171,
        LilyMeadow = 172,
        SugarLollipop = 173,
        SweetDessert = 174,
        MagicRay = 175,
        TeenParty = 176,
        FrozenHeat = 177,
        GagarinView = 178,
        FabledSunset = 179,
        PerfectBlue = 180,

        NumPresets
    };
    Q_ENUM(Preset)

    QGradient();
    QGradient(Preset preset);  //根据预定义的预设 preset构建一个梯度。
    //生成的渐变的坐标模式为OGradient::QbjectMode,允许将预设应用于任意对象大小。

    ~QGradient();

    bool operator == (const QGradient & gradient) const;
    inline
    bool operator != (const QGradient & other   ) const  { return !operator == (other); }

    enum Type {  //指定渐变类型。
         LinearGradient,
         RadialGradient,
        ConicalGradient,
             NoGradient
    };
    Q_ENUM(Type)
    Type type() const { return m_type; } //Returns the type of gradient.

    enum       Spread { //指定渐变区域外的区域应如何填充。
            PadSpread,  //该区域填充了最接近的停止颜色。这是默认设置。
        ReflectSpread,  //渐变在渐变区域外被反射。
         RepeatSpread   //渐变在渐变区域外重复。
    };
    Q_ENUM(Spread)
    Spread                     spread() const { return m_spread; }
    inline
    void                    setSpread(Spread spread) { m_spread = spread; }

    //在给定位置 pos创建一个停止点,并使用给定的颜色 color。位置 pos必须在范围0到1之间。
    void                    setColorAt(qreal pos, const QColor & color);

    //typedef QPair<qreal, QColor> QGradientStop;
    //typedef QList<QGradientStop> QGradientStops; //一个颜色列表
    //返回此渐变的停止点列表集合。如果没有指定停止点,则使用从0到1的黑色到白色渐变。
    QGradientStops             stops() const;
    void                    setStops(const QGradientStops & stopPoints);
    //用给定的 stopPoints替换当前的一组停止点。
    //这些点的位置必须在0到1的范围内,并且必须按照最低点在前的方式进行排序。

    enum         InterpolationMode { //无注释
            ColorInterpolation,
        ComponentInterpolation
    };
    InterpolationMode          interpolationMode() const; // interpolate插值
    void                    setInterpolationMode(InterpolationMode mode);

    //此枚举指定如何将渐变坐标映射到用于绘制渐变的绘图设备。
    enum     CoordinateMode {
                LogicalMode,    //这是默认模式。梯度坐标在逻辑空间中指定,就像对象坐标一样。

        StretchToDeviceMode,    //在这种模式下,渐变坐标相对于绘图设备的边界矩形确定,
                                //其中(0,0)位于左上角,而(1,1)位于绘图设备的右下角。

         ObjectBoundingMode,    //这种模式与“对象模式”相同,
        //区别在于任何~{QBrush::transform()}{brush transform }`,
        //操作都是相对于逻辑空间(而非对象空间)执行的。这个枚举值已被弃用,不应在新代码中使用。

                 ObjectMode     //在这种模式下,渐变坐标相对于被绘制的对象的边界矩形确定,
                                //其中(0,0)位于左上角,而对象的边界矩形的右下角坐标为(1,1)。

    };
    Q_ENUM(CoordinateMode)
    //返回此梯度的坐标模式。默认模式为逻辑模式。LogicalMode
    CoordinateMode             coordinateMode() const;
    void                    setCoordinateMode(CoordinateMode mode);
    //将此渐变的坐标模式设置为指定的模式 mode。

}; //完结 class QGradient

(10)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值