【问题标题】:Stroking a path only inside/outside?仅在内部/外部抚摸路径?
【发布时间】:2013-03-01 20:56:49
【问题描述】:

给定QPainterPath,我如何仅在路径的内侧或外侧边缘(或非封闭路径的左侧或右侧)描边路径?

QPainter::strokePath() 将笔沿路径居中并导致相同数量的墨水落在两侧。有关所需效果的视觉示例,请参见我制作的这张图(针对 SVG 提案,而不是功能):

我不介意这是通过一些技巧来完成的,例如将路径本身设置为剪切区域(用于内部)或反剪切区域(用于外部)。

这里的目标是用低不透明度填充填充一个圆角矩形,然后用低不透明度描边在圆角矩形之外进行描边,以模拟 2 步“模糊”衰减。如果描边与填充重叠,则不透明度加倍,破坏效果。由于形状复杂,路径的简单缩放不会很好,即使它可能适用于上面绘制的圆形和矩形。

【问题讨论】:

    标签: qt qpainter


    【解决方案1】:

    您最好的选择可能是QPainterPathStroker。使用它来创建一条新路径,即路径的轮廓。然后使用 QPainterPath 操作,如两者之间的交集或减法:

    outsidePath = strokedPath.subtracted(originalPath);
    insidePath = strokedPath.intersected(originalPath);
    

    【讨论】:

      【解决方案2】:

      更好的方法是将混合模式设置为CompositionMode_Source

      QPainter * painter;
      painter->setCompositionMode(QPainter::CompositionMode_Source);
      painter->setPen(QPen{color, stroke, ...});
      painter->setBrush(QBrush{...});
      
      QPainterPath path;
      path.moveTo(...);
      path.lineTo(...);
      ...
      
      // No alpha composition issues
      painter->fillPath();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多