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

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

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

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

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

++只修改画刷的构成

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

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

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

(5) 以及

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

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

cpp 复制代码
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)

谢谢

相关推荐
淼淼76321 小时前
Qt拖动工具栏控件到图页中均匀展示
开发语言·c++·windows·qt
YouEmbedded1 天前
解码信号与槽(含 QTimer 应用)
qt·定时器·信号与槽
小灰灰搞电子1 天前
Qt SCXML 模块详解
开发语言·qt
开始了码1 天前
UDP 协议详解与 Qt 实战应用
qt·网络协议·udp
深蓝海拓2 天前
PySide6从0开始学习的笔记(三) 布局管理器与尺寸策略
笔记·python·qt·学习·pyqt
꧁坚持很酷꧂2 天前
Windows安装Qt Creator5.15.2(图文详解)
开发语言·windows·qt
淼淼7632 天前
QT表格与数据
开发语言·qt
小灰灰搞电子2 天前
Qt 实现炫酷锁屏源码分享
开发语言·qt·命令模式
追烽少年x2 天前
Qt面试题合集(二)
qt
零小陈上(shouhou6668889)2 天前
YOLOv8+PyQt5玉米病害检测系统(yolov8模型,从图像、视频和摄像头三种路径识别检测)
python·qt·yolo