画刷 QBrush

画刷 QBrush 是用来填充图形用的,QPen来绘制轮廓线(线段,矩形边框等)
QBrush的属性我们可以从QBrush类的构造函数中看出;

QBrush ()
QBrush ( Qt::BrushStyle style )
QBrush ( const QColor & color, Qt::BrushStyle style = Qt::SolidPattern )
QBrush ( Qt::GlobalColor color, Qt::BrushStyle style = Qt::SolidPattern )
QBrush ( const QColor & color, const QPixmap & pixmap )
QBrush ( Qt::GlobalColor color, const QPixmap & pixmap )
QBrush ( const QPixmap & pixmap )
QBrush ( const QImage & image )
QBrush ( const QBrush & other )
QBrush ( const QGradient & gradient )

可以看出QBrush 定义了 QPainter 的填充模式(style),具有样式、颜色(QColor)、渐变(QGradient)以及纹理(QPximap)等属性。
style定义了填充模式,通过枚举类型Qt::BrushStyle来实现,默认值是Qt::NoBrush,不进行任何填充;填充模式包括基本填充模式,渐变填充,和纹理填充模式,下图是不同的填充模式区别.
这里写图片描述

画刷还可以使用 QPixmap,渐变等来创建。
平铺绘制 QPixmap 可以使用 QPainter::drawTiledPixmap(),也可以像下面这样使用 texture pattern 实现平铺绘制:

void MainWidget::paintEvent(QPaintEvent *) {
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QPixmap pixmap(":/resources/Paint-Base-Bufferfly.png");
    QBrush brush(pixmap);
    painter.setBrush(brush);
    painter.drawRect(0, 0, width(), height());
}

画刷的color()定义了填充模式的颜色。这个颜色可以是 Qt 预定义的颜色常量,也就是Qt::GlobalColor,也可以是任意QColor对象。

画刷的gradient()定义了渐变填充。这个属性只有在样式是Qt::LinearGradientPattern、Qt::RadialGradientPattern或者Qt::ConicalGradientPattern之一时才有效。渐变可以由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);

当画刷样式是 Qt::TexturePattern时,texture()定义了用于填充的纹理。注意,即使你没有设置样式为Qt::TexturePattern,当你调用setTexture()函数时,QBrush会自动将style()设置为Qt::TexturePattern。

QPen定义了用于QPainter应该怎样画线或者轮廓线。画笔具有样式、宽度、画刷、笔帽样式和连接样式等属性。画笔的样式style()定义了线的样式。画刷brush()用于填充画笔所绘制的线条。笔帽样式capStyle()定义了使用QPainter绘制的线的末端;连接样式joinStyle()则定义了两条线如何连接起来。画笔宽度width()或widthF()定义了画笔的宽。注意,不存在宽度为 0 的线。假设你设置 width 为 0,QPainter依然会绘制出一条线,而这个线的宽度为 1 像素。也就是说,画笔宽度通常至少是 1 像素。

这么多参数既可以在构造时指定,也可以使用 set 函数指定,完全取决于你的习惯,例如:



QPainter
painter(this);


QPen
pen(Qt::green,
3,
Qt::DashDotLine,
Qt::RoundCap,
Qt::RoundJoin);


painter.setPen(pen);

等价于

QPainter painter(this);
QPen pen;  // creates a default pen

pen.setStyle(Qt::DashDotLine);
pen.setWidth(3);
pen.setBrush(Qt::green);
pen.setCapStyle(Qt::RoundCap);
pen.setJoinStyle(Qt::RoundJoin);

painter.setPen(pen);

使用构造函数的优点是代码较短,但是参数含义不明确;使用 set 函数则正好反过来。

<think>我们参考用户的问题和引用内容,特别是引用[2]中关于设置颜色透明度的方法。用户意图是设置QBrush的颜色不透明度,以实现绘制图形时的背景透明效果。 关键点: 1. 使用QColor设置颜色时,通过alpha通道(即透明度)控制不透明度。 2. 将带有透明度的QColor设置给QBrush。 3. 使用QBrush进行填充绘制。 步骤: (1) 创建QColor对象,并设置其RGBA值,其中A(alpha)表示透明度(0完全透明,255完全不透明)。 (2) 使用这个QColor对象创建QBrush。 (3) 将QBrush设置给QPainter。 (4) 绘制图形(如矩形、圆角矩形等)。 示例代码(在paintEvent中): ```cpp void MyWidget::paintEvent(QPaintEvent* event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 可选:抗锯齿 // 创建颜色并设置透明度(这里使用RGBA,A=100表示约40%不透明) QColor fillColor(100, 200, 255, 100); // R,G,B,A // 也可以使用setAlpha方法 // QColor fillColor(100, 200, 255); // fillColor.setAlpha(100); // 创建并设置颜色 QBrush brush(fillColor); // 设置到painter painter.setBrush(brush); // 设置笔(边框)为无,这样只填充 painter.setPen(Qt::NoPen); // 绘制圆角矩形(使用填充,背景透明) painter.drawRoundedRect(QRectF(50, 50, 200, 100), 20, 20); } ``` 注意: - 如果同时需要边框,可以设置带透明度的笔(QPen)。 - 引用[2]中的示例也展示了类似的方法,通过设置颜色的alpha值来实现透明效果[^2]。 另外,引用[3]提到可以使用QOpacityEffect来设置整个控件的透明度,但这里我们只需要在绘制时控制填充颜色的透明度,所以使用QColor的alpha通道更直接[^3]。 如果需要绘制带透明度的边框,可以这样设置笔: ```cpp QPen pen(Qt::yellow); pen.setWidth(2); // 设置笔颜色的透明度 QColor penColor = pen.color(); penColor.setAlpha(150); // 设置150的透明度 pen.setColor(penColor); painter.setPen(pen); ``` 这样,我们就可以同时控制填充和边框的透明度了。 总结:通过QColor的alpha通道(直接构造或使用setAlpha())来设置颜色透明度,然后将该颜色用于QBrush(填充)或QPen(边框),即可实现透明效果。</think>### 在 Qt 中使用 QBrush 设置颜色不透明度 在 Qt 中设置 QBrush 的颜色不透明度主要通过设置 QColor 的 alpha 通道值来实现。以下是详细的实现方法和步骤: #### 核心方法:设置颜色的 alpha 通道 ```cpp // 创建基础颜色 QColor color(100, 200, 255); // RGB 值 // 设置不透明度(alpha 值) color.setAlpha(150); // 取值范围 0(完全透明)~255(完全不透明) ``` #### 完整使用示例 ```cpp void MyWidget::paintEvent(QPaintEvent* event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿 // 创建带透明度的颜色 QColor fillColor(100, 200, 255); // RGB 值 fillColor.setAlpha(150); // 设置透明度(150/255 ≈ 60%不透明) // 创建带透明度的 QBrush brush; brush.setColor(fillColor); // 设置颜色 brush.setStyle(Qt::SolidPattern); // 设置填充样式 // 应用 painter.setBrush(brush); painter.setPen(Qt::NoPen); // 不绘制边框 // 绘制带透明度的矩形 painter.drawRoundedRect(QRect(50, 50, 300, 200), 20, 20); } ``` #### 关键参数说明 1. **alpha 值范围**: - `0`:完全透明(不可见) - `255`:完全不透明 - 中间值:半透明效果(例如 `150` 约等于 60% 不透明度) 2. **替代设置方法**: ```cpp // 方法1:在构造函数中直接设置 RGBA QColor color(100, 200, 255, 150); // R, G, B, A // 方法2:使用十六进制格式 QColor color("#6496FF96"); // 格式:#RRGGBBAA ``` 3. **透明度效果对比**: | Alpha 值 | 透明度效果 | 适用场景 | |----------|----------------|---------------------| | 0-50 | 高度透明 | 阴影、微弱高亮效果 | | 50-150 | 中等透明 | 半透明面板、覆盖层 | | 150-200 | 低度透明 | 强调元素 | | 200-255 | 基本不透明 | 主要内容 | #### 高级技巧 1. **分层绘制实现复杂效果**: ```cpp // 先绘制底层(不透明) QBrush opaqueBrush(QColor(255, 255, 255)); painter.setBrush(opaqueBrush); painter.drawRect(rect()); // 再绘制上层(半透明) QColor overlayColor(100, 200, 255, 100); // 40%不透明 painter.setBrush(QBrush(overlayColor)); painter.drawRoundedRect(overlayRect, 20, 20); ``` 2. **动态调整透明度**: ```cpp // 根据条件动态设置透明度 int alpha = isHighlighted ? 200 : 100; QColor dynamicColor(100, 200, 255, alpha); ``` 3. **使用 QOpacityEffect 控件级透明**: ```cpp // 对整个控件设置透明度 QGraphicsOpacityEffect* opacityEffect = new QGraphicsOpacityEffect; opacityEffect->setOpacity(0.7); // 70%不透明度 yourWidget->setGraphicsEffect(opacityEffect); ``` #### 常见问题解决 1. **透明效果无效**: - 确保窗口设置了透明背景属性: ```cpp setAttribute(Qt::WA_TranslucentBackground); setStyleSheet("background: transparent;"); ``` - 检查父控件是否遮挡了透明区域 2. **性能优化**: - 避免在频繁调用的 paintEvent 中创建 QColor 对象 - 对静态效果使用 QPixmap 缓存 - 使用 `QPainter::setCompositionMode()` 优化混合模式 > 通过合理设置 QColor 的 alpha 通道值,可以轻松实现从完全透明到完全不透明之间的各种效果,这对于创建现代化 UI 的层次感和视觉深度至关重要[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值