C++ Qt:创建铅笔/画笔工具

C++ Qt:创建铅笔/画笔工具,c++,qt,C++,Qt,我正在使用QT,我能够创建一个基本的MS画笔绘图工具。 我通过用线连接一系列点来创建铅笔工具。 对于不透明的细线,它看起来不错,但对于粗线和透明线,我得到了alpha透明度重叠(因为这些线在共享点相交)。我已经研究过了,一些建议是在一个单独的透明缓冲区上绘制,并在那里渲染,获得最大不透明度,然后将其渲染回原始缓冲区,但我真的不知道如何在Qt中做到这一点 我对图形或Qt不是很有经验,所以我不知道该方法。像MyPaint和Krita这样的程序是如何处理画笔的,以保持漂亮的透明线而不重叠 我不想要的是

我正在使用QT,我能够创建一个基本的MS画笔绘图工具。 我通过用线连接一系列点来创建铅笔工具。 对于不透明的细线,它看起来不错,但对于粗线和透明线,我得到了alpha透明度重叠(因为这些线在共享点相交)。我已经研究过了,一些建议是在一个单独的透明缓冲区上绘制,并在那里渲染,获得最大不透明度,然后将其渲染回原始缓冲区,但我真的不知道如何在Qt中做到这一点

我对图形或Qt不是很有经验,所以我不知道该方法。像MyPaint和Krita这样的程序是如何处理画笔的,以保持漂亮的透明线而不重叠

我不想要的是:


我想要的效果是:

由于您没有显示任何代码,我将假设您所做的是存储一组点,然后在绘制函数中,使用画家绘制这些点。当您在已经绘制的区域上绘制时,会产生效果

可以用来防止这种情况的一种方法是使用QPainterPath对象。当鼠标按下事件发生时,对QPainterPath对象使用moveTo函数。然后为鼠标移动事件调用lineTo函数

最后,在渲染时,不要绘制点,而是渲染QPainterPath对象

----------编辑--------------------------------------

由于您已经添加了所需效果的示例,因此我更好地理解您的问题,您可能无法在此处使用QPainterPath,但我建议将其用于不透明线条

但是,如果在将线添加到QPainterPath之前计算出渐变更改,则可以在QPainterPath中使用渐变笔,并以您想要的方式进行操作。或者

你在最初的答复中提到了这一点:-

在单独的透明缓冲区上绘制并在那里渲染,获得最大不透明度并将其渲染回原始缓冲区

这听起来比单词缓冲区更复杂。实际上,您只需创建一个单独的QImage并绘制到该QImage,而不是屏幕。然后在绘制屏幕时,您可以复制图像。要“获得最大不透明度”,您可以扫描图像上的位并查看alpha通道,或者保留一个单独的信息结构,记录笔的压力及其在每个点的位置。我希望得到alpha增加然后减少时的最大值和最小值,并线性插值以进行渲染,而不是尝试映射每一分钟的变化

在将缓冲区图像渲染回主图像时,我认为您需要在QPainter上设置合成模式,但在我看来,我不确定是哪一种。阅读文档以了解它们的作用,并对它们进行实验以了解它们产生的效果


根据我在图形方面的经验,通常情况下,我发现您需要进行实验,以了解什么是有效的,并对您正在做的事情有一种感觉,特别是当您发现您使用的方法开始变慢时,您需要对其进行优化,使其以合理的帧速率工作。

因为您没有显示任何代码,我将假设你正在做的是存储一组点,然后在一个绘制函数中,使用一个画师来绘制这些点。当您在已经绘制的区域上绘制时,会产生效果

可以用来防止这种情况的一种方法是使用QPainterPath对象。当鼠标按下事件发生时,对QPainterPath对象使用moveTo函数。然后为鼠标移动事件调用lineTo函数

最后,在渲染时,不要绘制点,而是渲染QPainterPath对象

----------编辑--------------------------------------

由于您已经添加了所需效果的示例,因此我更好地理解您的问题,您可能无法在此处使用QPainterPath,但我建议将其用于不透明线条

但是,如果在将线添加到QPainterPath之前计算出渐变更改,则可以在QPainterPath中使用渐变笔,并以您想要的方式进行操作。或者

你在最初的答复中提到了这一点:-

在单独的透明缓冲区上绘制并在那里渲染,获得最大不透明度并将其渲染回原始缓冲区

这听起来比单词缓冲区更复杂。实际上,您只需创建一个单独的QImage并绘制到该QImage,而不是屏幕。然后在绘制屏幕时,您可以复制图像。要“获得最大不透明度”,您可以扫描图像上的位并查看alpha通道,或者保留一个单独的信息结构,记录笔的压力及其在每个点的位置。我希望得到alpha增加然后减少时的最大值和最小值,并线性插值以进行渲染,而不是尝试映射每一分钟的变化

在将缓冲区图像渲染回主图像时,我认为您需要在QPainter上设置合成模式,但在我看来,我不确定是哪一种。阅读文档以了解它们的作用,并对它们进行实验以了解它们产生的效果

根据我在图形方面的经验,通常情况下,我会发现你需要进行实验,看看什么是有效的,并对你正在做的事情有一个感觉,特别是当你发现你正在使用的方法开始变慢时,你需要优化它以合理的帧速率工作。

查看我对这个问题的答案。这一点在这里也适用

为了不只是提供链接,我将在这里重复回答:

您需要将painter的构图模式设置为source。两者都有吸引力