QT6 源,十章绘图(2)画刷 QBrush:刷子只涉及填充颜色,线型,填充图片,以及变换矩阵这几个属性,附源代码带注释。

发布于:2025-08-02 ⋅ 阅读:(14) ⋅ 点赞:(0)

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

在这里插入图片描述

(2)本类是支持流运算的

在这里插入图片描述

(3)本类的构造函数与运算符 operator 函数

在这里插入图片描述

++关于本类的构造函数,进行以下测试

在这里插入图片描述

++只修改画刷的构成

在这里插入图片描述

++以及,看来与 类型 QBitmap 有关

在这里插入图片描述

++关于渐变填充,随后在渐变篇测试

(4) 本类型支持相等与不等比较

在这里插入图片描述

(5) 以及

在这里插入图片描述

++本刷子的代码完毕。就这些。

(6)本源代码定义于头文件 qbrush . h

QT_BEGIN_NAMESPACE


/*
The QBrush class defines the fill pattern of shapes drawn by QPainter.

Detailed Description :
画笔具有样式、颜色、渐变和纹理。  (构造;质地;结构;纹理; texture)
A brush has a style, a color, a gradient and a texture.

画笔的`style()`函数使用`Qt::BrushStyle`枚举来定义填充图案。
默认的画笔样式是`Qt::NoBrush`(具体取决于如何构建画笔)。
该样式指示绘图器不填充形状填充的标准样式是`Qt::SolidPattern'。
在创建画笔时可以通过相应的构造函数设置该样式,此外,`setStyle()、函数提供了在创建画笔后更改样式的手段。

画笔的`color()`函数定义了填充图案的颜色。
颜色可以是Qt预定义的色值之一Qt::GlobalColor,或者任何其他自定义的`QColor'。
当前设置的颜色可以通过color()、和`setColor()、函数分别进行检索和更改。

gradient()、函数定义了当前样式为 Qt::LinearGradientPattern、
Qt::RadialGradientPattern 或 Qt::ConicalGradientPattern 时使用的渐变填充(圆锥形的 Conical)。
在创建QBrush 时,通过将 QGradient 作为构造函数的参数来创建渐变笔刷。
Qt 提供了三种不同的渐变:QLinearGradient、QConicalGradient和 QRadialGradient,
它们都继承自QGradient.

    QRadialGradient gradient(50, 50, 50, 50, 50);
    gradient.setColorAt(0, QColor::fromRgbF(0, 1, 0, 1));
    gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));

    QBrush brush(gradient);

texture()、函数定义了在当前样式为 Qt::TexturePattern 时使用的位图。
您可以通过在创建画笔时提供位图或通过使用`setTexture()、方法来创建带有纹理的画笔。

请注意,调用setTexture()将使style()等于Qt::TexturePattern,而无论先前的样式设置如何。
此外,如果样式是渐变样式,调用setcolor()将不会产生任何影响。
同样,如果样式是Qt::TexturePattern样式,除非当前纹理是QBitmap,否则也不会产生任何影响。

isOpaque()函数返回true如果画笔是完全不透明的,否则返回false。
如果满足以下条件,则认为画笔是不透明的:
    *颜色的alpha组件是255。
    *其纹理()没有alpha通道,也不是QBitmap。
    *渐变中的颜色都有一个为255的alpha组件。

要指定线条和轮廓的样式和颜色,请使用Painter's笔,并结合Qt::PenStyle和Qt:GlobalColor.
    QPainter painter(this);

    painter.setBrush(Qt::cyan);
    painter.setPen(Qt::darkCyan);
    painter.drawRect(0, 0, 100,100);

    painter.setBrush(Qt::NoBrush);
    painter.setPen(Qt::darkGreen);
    painter.drawRect(40, 40, 100, 100);


请注意,默认情况下,QPainter在绘制形状时会使用当前设置的笔来渲染轮廓。
使用 painter.setPen(Qt::NoPen)可以禁用此行为。


*/

/*
//这个枚举类型定义了Qt支持的画笔样式,即使用Painter绘制的形状的填充式。
enum BrushStyle { // brush style
                   NoBrush, //No brush pattern.
              SolidPattern, //Uniform color.
             Dense1Pattern, //Extremely dense brush pattern.
             Dense2Pattern, //Very dense brush pattern.
             Dense3Pattern, //Somewhat dense brush pattern.
             Dense4Pattern, //Half dense brush pattern
             Dense5Pattern, //有点稀疏的刷子图案。
             Dense6Pattern, //Very sparse稀疏的 brush pattern.
             Dense7Pattern, //Extremely sparse brush pattern.
                HorPattern, //Horizontal lines
                VerPattern, //Vertical lines.
              CrossPattern, //Crossing horizontal and vertical lines.
              BDiagPattern, //Backward diagonal lines. 向后对角线。
              FDiagPattern, //Forward diagonal lines.
          DiagCrossPattern, //Crossing diagonal lines.
     LinearGradientPattern, //Linear gradient
     RadialGradientPattern, //RadialGradient
    ConicalGradientPattern, //ConicalGradient
            TexturePattern = 24 //自定义图案 Custom pattern
};

*/


struct QBrushData;
class QPixmap;
class QGradient;
class QVariant;
struct QBrushDataPointerDeleter
{
    void operator()(QBrushData * d) const noexcept; //括号()运算符函数
};

//QBrush stream functions
Q_GUI_EXPORT QDataStream & operator<<(QDataStream &, const QBrush &);
Q_GUI_EXPORT QDataStream & operator>>(QDataStream &,       QBrush &);
Q_GUI_EXPORT QDebug        operator<<(QDebug       , const QBrush &);

struct QBrushData
{
    QAtomicInt ref;
    Qt::BrushStyle style;
    QColor color;
    QTransform transform;
};

class Q_GUI_EXPORT QBrush
{
private:
    friend class  QRasterPaintEngine;
    friend class  QRasterPaintEnginePrivate;
    friend struct QSpanData;
    friend class  QPainter;
    friend bool   Q_GUI_EXPORT qHasPixmapTexture(const QBrush & brush);

    void detach(Qt::BrushStyle newStyle);

    void init(const QColor & color, Qt::BrushStyle bs);
    //对画刷的初始化只关注这俩方面:颜色与样式

    DataPtr d; //本类的数据成员

public:

    QBrush(); //构建一个默认的黑色画刷,样式为Qt::NoBrush(即此画笔不会填充形状)。

    QBrush(Qt::BrushStyle bs); //使用给定的样式 bs构建一个黑色画刷。

    //Constructs a brush with the given color and style. 使用给定的颜色和样式构造一个画刷。
    QBrush(const QColor    & color, Qt::BrushStyle bs = Qt::SolidPattern);
    QBrush(Qt::GlobalColor   color, Qt::BrushStyle bs = Qt::SolidPattern);

    //创建一个黑色的刷子,并将纹理设置为给定的像素图 pixmap。样式设置为Qt::TexturePattern。
    QBrush(const QPixmap   & pixmap);
    QBrush(const QImage    & image );

    QBrush(const QColor    & color, const QPixmap & pixmap); //模式 pattern
    QBrush(Qt::GlobalColor   color, const QPixmap & pixmap);
    //使用给定的颜色 color和存储在pixmap中的自定义图案构造一个画刷。
    //样式设置为Qt::TexturePattern。颜色仅对QBitmap有效。

    QBrush(const QGradient & gradient); //根据给定的渐变 gradient构造一个画刷。
    //笔刷样式被设定为相应的渐变样式(可以是 Qt::LinearGradientPattern、
    //  Qt:.RadialGradientPattern或Qt::ConicalGradientPattern),

    QBrush(const QBrush    & brush);    // copy构造函数

    QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QBrush)

    ~QBrush();

    QBrush & operator=(const QBrush & brush); // copy赋值运算符函数

    operator QVariant() const; //类型转换运算符函数

    bool operator==(const QBrush & b) const;
    inline
    bool operator!=(const QBrush & b) const
    {   return !(operator==(b));   }

    inline void swap(QBrush & other) noexcept { qSwap(d, other.d); }

    using DataPtr = std::unique_ptr<QBrushData, QBrushDataPointerDeleter>; //独占式智能指针

    inline
    bool      isDetached() const { return d->ref.loadRelaxed() == 1; }

    bool      isOpaque() const; //如果画笔完全不透明,则返回true;否则返回false。
    //如果满足以下条件,则认为画笔是不透明的:
    //  颜色的alpha组件为255。
    //  其纹理(texture)没有 alpha通道且不是QBitmap。
    //  渐变中的颜色()都具有alpha组件为255。
    //  它是一个扩展的径向渐变。

    inline DataPtr  & data_ptr  ()       { return d; }

    const QGradient * gradient() const; //返回描述此画刷的渐变。

    inline const
    QColor          &         color() const { return d->color; }
    void                   setColor(const QColor    & color); //画刷颜色
    inline
    void                   setColor(Qt::GlobalColor   color)
    {   setColor(QColor(color));   }
    //将画笔颜色设置为给定的颜色 color。
    //请注意,如果样式是渐变样式,调用setcolor()并不会产生任何影响。
    //同样,如果样式是 Qt:TexturePattern 样式,除非当前纹理是 QBitmap,否则也不会产生影响。

    inline
    Qt::BrushStyle            style() const { return d->style; }
    void                   setStyle(Qt::BrushStyle); //画刷样式

    //返回自定义刷子图案,如果没有设置自定义刷子图案,则返回空位图。
    QPixmap                   texture     () const;
    void                   setTexture     (const QPixmap & pixmap);
    //将画笔的像素图设置为给定的像素图 pixmap。样式被设置为  Qt::TexturePattern纹理模式。
    //当前的画笔颜色仅对单色位图有效,即对于QPixmap::depth()==1(QBitmap)

    //如果纹理设置为QPixmap,它将被转换为QImage。
    QImage                    textureImage() const;
    void                   setTextureImage(const QImage  & image );
    //请注意,当前的笔刷颜色对单色图像不会有任何影响,这与使用QBitmap调用setTexture()不同。
    //如果您想改变单色图像笔刷的颜色,可以先将图像转换为QBitmap,使用QBitmap::fromImage()函数,
    //  然后将生成的QBitmap用作纹理,或者修改图像颜色表中的条目。

    inline  //返回当前的刷子变换矩阵。
    QTransform                transform() const { return d->transform; }
    void                   setTransform(const QTransform & matrix);
    //将矩阵 matrix设置为当前笔刷上的显式变换矩阵。
    //笔刷变换矩阵会与QPainter变换矩阵合并,以产生最终结果。

}; //完结 class QBrush
Q_DECLARE_SHARED(QBrush)

QT_END_NAMESPACE

(7)关于渐变的三个类,也在本头文件,后文介绍。

(8)

谢谢


网站公告

今日签到

点亮在社区的每一天
去签到