如何用Qt做粉笔风格的绘画

时间:2013-08-05 18:56:37

标签: qt drawing

我想用Qt画粉笔风格的线条,就像你通常在黑板上看到的那样。以下是我想到的一个例子:

Chalk style drawing sample image

实现此渲染样式的最佳方法是什么?我是否需要使用特殊画笔绘制很多小线条,或者是否有更好的方法来获得样本图像中的“曲线”样式?

整合这个的最佳位置在哪里?从理论上讲,将它放在QPainter下是理想的,例如在自定义QPaintEngine中,例如所有各种QPainter :: drawLine调用最终都使用了粉笔样式。但是,看起来虽然QPaintEngine界面看起来很完美,但这个类本身并不适合用于此目的......

提前感谢您的帮助。

问候,

费边

2 个答案:

答案 0 :(得分:1)

我会开始查看QGraphicsEffect的方式..我认为应该有可能开发出这样的过滤器,它会产生类似的效果。

我会在这里更新您的评论答案。

不,QGraphicsEffect可以应用'每个图形项'。如果您查看QGraphicsItem,您将看到有一个setGraphicsEffect方法,因此您可以设计一个适用于QGraphicsLineItem的效果,并将其设置为您想要看起来很白垩的行。

重要的是你不必对预先绘制的图像进行操作,你可以使用graphicsEffect完全使用所有者绘制项目(例如假设效果仅适用于QGraphicsLineItem)预先绘制它使用drawSource()然后修改或从头开始完全绘制它。

我很乐意帮助你进行一些编码,可能会在下周的某个地方进行编码,因为我现在需要为我正在进行的项目提供类似的东西..但是接下来的几天没有时间.. < / p>

我会在完成后立即通过来源链接更新答案。

自定义画笔看起来也很有前途......

答案 1 :(得分:1)

我以不同的方式解决了这个问题。使用纹理刷子没有提供良好的结果(也许我的错)。遗憾的是,QGraphicsEffect不是一个选项,因为我的渲染不是基于QGraphicsView。

我最终做了什么:

  • 从QPainter(即ChalkPainter)派生自己的班级
  • 向ChalkPainter添加了一个新的drawChalkLine()方法。此方法接受传递的行,将其拆分为较小的块,并通过QPainter :: drawPath将这些块渲染为贝塞尔曲线。对于每个贝塞尔曲线块,我随机地移动与该线正交的控制点。
  • 接下来,我在ChalkPainter类中添加了其他渲染方法,例如drawChalkRect(),所有这些都在内部使用drawChalkLine()方法。

这不是最优雅的方法,因为我无法直接使用QPainter方法,但它为我的目的提供了良好的结果。这是一个例子:

enter image description here