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
和渐变,但我不知道该怎么做。
虽然Qt肯定具有many drawing functions,但没有让您使用pixmap笔刷沿着您描述的路径进行绘制的内容。
我可以想到两种实现您想要的方法:
使用标准的非模糊画笔多次绘制路径,并且画笔宽度和透明颜色都不同。经过足够的迭代,这将近似于您要查找的“模糊线”。
沿着路径反复绘制像素图。通常这是诸如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);
可能的改进包括计算间距,使其准确地在行的末端结束,也许更正确地计算所需的绘制次数将最好地给人以线条感。
实现此目的的一种方法是将QRadialGradient用作QPen的画笔:
作为一个初步的答案。我知道您说过QT,但我不熟悉。我将为您提供一些我自己用于工作的GLSL代码,希望对您有所帮助。