QPainter绘制线条:配置水平透明度渐变(画笔硬度)
实现QPainter软画笔线条(边缘透明度渐变)
好问题!要实现这种类似图像编辑工具里的软画笔线条(中心实、边缘逐渐透明的硬度效果),QLine本身并没有直接的衰减属性——它只是一个描述线段的数据结构,绘制效果完全由QPainter和QPen控制。我们可以通过自定义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




