我已经开始创建一个与绘图板交互的绘图程序。根据笔在数位板上的压力,我会更改正在绘制的线条的 alpha 值。该机制有效。
细线看起来不错,看起来像一个真实的草图。但是由于我在两点之间画线(就像在 Qt scribble 教程中一样)来绘制,所以线关节之间存在 alpha 重叠,对于粗笔画来说非常明显。
这是线对线连接的效果:
如您所见,线段之间存在难看的 alpha 混合。
为了解决这个问题,我决定使用 aQPainterPath
来渲染线条。这有两个问题:
- 一条长的、连续的、粗的路径很快就会滞后于程序。
- 由于路径是连接的,因此它充当一个路径,因此对 alpha 值的任何更改都会影响整个路径(我不希望这样做,因为我想保留混合效果)。
以下图像使用QPainterPath
.
我想保留的混合效果。
下图显示了第二个问题,它改变了整个路径的 alpha 和粗细
红色文本应为:“如果在不将笔从数位板表面移开的情况下施加更大的压力,则线条变粗”(并且 alpha 变得不透明)
另一件事是,通过这种方法,我只能得到从暗到亮(或从粗到细的路径宽度)的混合轨迹,但不能从亮到暗。我不确定为什么会出现这种效果,但我最好的猜测是它与整个路径更新的线段有关。
我确实让程序根据笔在平板电脑上的压力增加/减少 alpha 和线条粗细。
问题是我想渲染没有 alpha 重叠的线条并QPainterPath
更新我不想要的整个路径的 alpha 和厚度。
这是创建路径的代码:
switch(event->type()){
case QEvent::TabletPress:
if(!onTablet){
onTablet = true;
//empty for new segment
freePainterPath();
path = new QPainterPath(event->pos());
} break;
case QEvent::TabletRelease:
if(onTablet)
onTablet = false;
break;
case QEvent::TabletMove:
if(path != NULL)
path->lineTo(event->pos());
if(onTablet){
//checks for pressure of pen on tablet to change alpha/line thickness
brushEffect(event);
QPainter painter(&pixmap);
//renders the path
paintPixmap(painter, event);
} break;
default:;
}
update();
我想要作为单个路径的预期效果(使用 Krita 绘制程序创建的图像):