【发布时间】:2020-01-04 14:53:03
【问题描述】:
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 是否允许您进行逐像素操作?您可以将单个像素的值设置为任意颜色吗?
-
@Makogan 是的,可以通过QPainter::drawPoint 做到这一点
-
好的,这根本不是解决此问题的有效方法,但根据您的要求,它可能已经足够好了。让你的 10 像素线让其中 4 个像素完全不透明,所以你只需画一条粗细为 4 的常规线。然后画一条粗细为 1 的线,平行于前一条线,但沿正交偏移一个像素该线的方向(旋转 90 度的方向矢量)您不断绘制这些平行线,当您远离原始线时,它们会逐渐透明。
-
如果您可以通过 QT 访问着色器,我认为它支持,您可以创建自己的自定义线着色器,通过绘制一个矩形而不是默认的 QT 线来为您执行此操作。
-
这就是抗锯齿的工作原理。着色器上正确的线抗锯齿算法是。您绘制一个矩形,然后相对于当前渲染点到线的距离从不透明插入到透明度。即您有一个矩形,该矩形的中线是您要渲染的线。该矩形上点的透明度与到线的距离成正比。我不确定的是 QT 给你多少控制来操纵它的着色管道。