使用 QPainter 绘制带有渐变边缘的线条和曲线

dal*_*t97 7 c++ graphics qt qpainter

QPainter 很容易使用,画一条线只需这样做:

QPainter painter(&image);
QPen pen;
pen.setWidth(5);
pen.setColor("black");
painter.setPen(pen);
painter.drawLine(QPointF(0,0), QPointF(200,250));
Run Code Online (Sandbox Code Playgroud)

现在这很好用,但我想创建一个“特殊”的笔,产生带有“平滑”边缘的线条。例如,假设我要绘制的线条的粗细为 10 像素,那么我希望线条的中间(中间我指的是粗细而不是长度)完全不透明,并且在线条的边缘应该变得半透明。我相信这可以得到,例如将下面的图片作为我的点,然后“拖动”并绘制线条,这样我就会获得我想要的效果。我知道 Qt 为您提供了QBrush渐变,但我不知道如何做到这一点。

图片

小智 1

实现此目的的一种方法是使用QRadialGradient作为 QPen 的画笔:

QPointF centerPoint(400, 400);
qreal centerRadius = 200;

QRadialGradient radialGrad(centerPoint, centerRadius);
radialGrad.setColorAt(0.000, QColor(0, 0, 0, 255));
radialGrad.setColorAt(0.8, QColor(0, 0, 0, 0.8 * 255));
radialGrad.setColorAt(1.000, QColor(0, 0, 0, 0.000));

QPen pen;
pen.setWidth(400);
pen.setColor("black");
pen.setBrush(radialGrad);

QPainter painter(this);
painter.setPen(pen);
painter.drawPoint(centerPoint);
Run Code Online (Sandbox Code Playgroud)

渐变画笔截图结果

该技术的缺点是梯度在 GradientStop 附近不平滑。您应该添加几个 GradientStop 来缓解径向渐变。

实现此目的的另一种(并且更漂亮)方法可能是创建一个具有专用纹理或纹理图像(使用方法QBrush::setTextureQBrush::setTextureImage)的自定义 QBrush ,表示所需的画笔图案。