用QPainter绘制一条带有褪色边缘的线和曲线

问题描述 投票:3回答:3

QPainter非常易于使用,只需画一条线即可:

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

现在这很好用,但是我想创建一种“特殊”笔,以产生具有“平滑”边缘的线条。例如,假设我要绘制的线的厚度为10像素,那么我希望线的中间(中间是指厚度而不是长度)是完全不透明的,并且线的边缘应该变成半透明的。我认为可以例如以下面的图片为我的观点,然后“拖动”并绘制线条,以便获得所需的效果。我知道Qt为您提供QBrush和渐变,但我不知道该怎么做。

Pic

c++ qt graphics qpainter
3个回答
1
投票

虽然Qt肯定具有many drawing functions,但没有让您使用pixmap笔刷沿着您描述的路径进行绘制的内容。

我可以想到两种实现您想要的方法:

  1. 使用标准的非模糊画笔多次绘制路径,并且画笔宽度和透明颜色都不同。经过足够的迭代,这将近似于您要查找的“模糊线”。

  2. 沿着路径反复绘制像素图。通常这是诸如photoshop或gimp之类的绘图软件将执行此操作的方式,因为它允许在参数(例如不同的笔刷像素图和方向等)中提供一定的灵活性。

我将尝试提供示例代码(由于我目前不在开发计算机中,所以目前尚未试用),这里是第二种方法:

void drawPathWithPixmapBrush(QPainter painter, QPainterPath path, QPixmap pixmapBrush, qreal spacing=1.0) {
    qreal length = path.length();
    qreal pos = 0.0;
    // Adjust the spacing to be relative to brush size
    spacing=(spacing * pixmapBrush.width() );
    while (pos < length) {
        qreal percent = path.percentAtLength(pos);
painter.drawPixmap(path.pointAtPercent(percent), pixmapBrush);
pos += spacing;
    }
}

如您所见,此代码将沿着给定的QPainterPath迭代移动,并针对每个步骤将QPixmap画笔绘制到给定的QPainter,从而可以沿路径绘制一条连续的线用像素图画笔。

[QPainterPath支持QPainter进行的所有绘制操作,例如多边形,样条线,直线,拱形等,因此,它将在大多数情况下代替您现有的QPainter绘制调用(请参见the full list of drawing operations。]]

这里是使用QPainterPath构造简单直线段的示例代码:

QPainterPath path
QPointF lastPosition(10, 10);
QPointF currentPosition(100, 100);
path.moveTo(lastPosition);
path.lineTo(currentPosition);

可能的改进包括计算间距,使其准确地在行的末端结束,也许更正确地计算所需的绘制次数将最好地给人以线条感。


0
投票

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


-1
投票

作为一个初步的答案。我知道您说过QT,但我不熟悉。我将为您提供一些我自己用于工作的GLSL代码,希望对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.