You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

QPainter绘制线条:配置水平透明度渐变(画笔硬度)

实现QPainter软画笔线条(边缘透明度渐变)

好问题!要实现这种类似图像编辑工具里的软画笔线条(中心实、边缘逐渐透明的硬度效果),QLine本身并没有直接的衰减属性——它只是一个描述线段的数据结构,绘制效果完全由QPainterQPen控制。我们可以通过自定义QPen的渐变填充来模拟这个效果,核心思路是沿着线条的宽度方向(垂直于线条的方向)实现Alpha通道的衰减。

核心实现思路

软画笔的本质是:线条中心区域颜色完全不透明,向两侧边缘逐渐过渡到完全透明。我们可以用QRadialGradient创建一个圆形的透明度渐变,然后把这个渐变作为画笔的填充,让它沿着线条方向拉伸,就能实现所需的软边缘效果。

具体代码示例

// 初始化画笔,设置宽度和圆角端点(匹配软画笔的圆形端点)
QPen softBrushPen;
softBrushPen.setWidth(12);
softBrushPen.setCapStyle(Qt::RoundCap);

// 创建径向渐变:中心为不透明黑色,边缘为完全透明的黑色
// 渐变中心在(0,0),半径等于画笔宽度的一半(覆盖整个线条宽度)
QRadialGradient gradient(0, 0, softBrushPen.width() / 2.0);
gradient.setColorAt(0, QColor(Qt::black));          // 线条中心:完全不透明
gradient.setColorAt(1, QColor(Qt::black, 0));       // 线条边缘:完全透明

// 将渐变设置为画笔的填充样式
softBrushPen.setBrush(gradient);

// 绘制线条
QPainter p;
p.setPen(softBrushPen);
p.drawLine(QPointF(0, 0), QPointF(1024, 1024));

调整画笔硬度

如果想要调整线条的硬度(比如让边缘衰减更快,接近硬画笔),可以修改渐变的颜色停止点,让不透明区域占比更大:

// 前80%的宽度保持完全不透明,最后20%快速衰减到透明(硬度更高)
gradient.setColorAt(0, QColor(Qt::black));
gradient.setColorAt(0.8, QColor(Qt::black));
gradient.setColorAt(1, QColor(Qt::black, 0));

原理说明

QRadialGradient会被QPen自动沿着线条的长度方向拉伸,形成一个“无限长”的渐变条——在宽度方向上,从中心到边缘透明度逐渐降低,正好匹配软画笔的视觉效果。而Qt::RoundCap保证了线条的端点也是圆形的渐变效果,和图像编辑工具的画笔表现一致。

内容的提问来源于stack exchange,提问作者b00dle

火山引擎 最新活动