gpt4 book ai didi

c++ - 如何使用 QPainter 或 QPainterPath 使用一个形状或一组连接的形状在 Qt 中绘制自定义形状

转载 作者:可可西里 更新时间:2023-11-01 18:06:50 28 4
gpt4 key购买 nike

如何绘制像眼泪一样的形状?我需要在不使用多个形状(椭圆和多边形)的情况下进行绘制,因为 QPen 将为每个形状绘制。我需要连接形状以创建一个新形状,或者告诉 QT 连接两个形状的边界,如下所示:

tear

最佳答案

如果您要绘制的形状可以表示为其他形状的分层,就像您链接到的图像一样,这很容易做到:

首先我们需要构建一个QPainterPath 来表示形状的外边缘。我们通过将更简单的形状分层来构建它;对于您的示例,我们需要一个圆形和一个正方形。注意 QPainterPath::setFillRule(Qt::WindingFill) 的使用: 这将在以后影响绘制路径的方式(尝试将其删除以查看差异!)。

QPainterPath OuterPath;
OuterPath.setFillRule(Qt::WindingFill);
OuterPath.addEllipse(QPointF(60, 60), 50, 50);
OuterPath.addRect(60, 10, 50, 50);

对于您提供的示例,我们还需要从填充形状的中心移除一个圆形区域。让我们将内部“边框”表示为 QPainterPath,然后使用 QPainterPath::subtracted()OuterPath 中减去 InnerPath 并生成我们的最终形状:

QPainterPath InnerPath;
InnerPath.addEllipse(QPointF(60, 60), 20, 20);

QPainterPath FillPath = OuterPath.subtracted(InnerPath);

构建形状路径后,我们需要使用它们来填充/勾勒形状。让我们首先创建一个 QPainter 并将其设置为使用抗锯齿:

QPainter Painter(this);
Painter.setRenderHint(QPainter::Antialiasing);

然后我们需要填充我们构建的形状:

Painter.fillPath(FillPath, Qt::blue);

最后,让我们画出轮廓。请注意,因为我们有单独的内部和外部边界路径,我们可以用不同的线条粗细来描边每个边界。另请注意 QPainterPath::simplified() 的使用:这会将一组分层形状转换为一个没有交叉点的 QPainterPath:

Painter.strokePath(OuterPath.simplified(), QPen(Qt::black, 1));
Painter.strokePath(InnerPath, QPen(Qt::black, 3));

如果我们将所有这些放在一起,它看起来像这样:

void Shape::paintEvent(QPaintEvent *)
{
QPainterPath OuterPath;
OuterPath.setFillRule(Qt::WindingFill);
OuterPath.addEllipse(QPointF(60, 60), 50, 50);
OuterPath.addRect(60, 10, 50, 50);

QPainterPath InnerPath;
InnerPath.addEllipse(QPointF(60, 60), 20, 20);

QPainterPath FillPath = OuterPath.subtracted(InnerPath);

QPainter Painter(this);
Painter.setRenderHint(QPainter::Antialiasing);

Painter.fillPath(FillPath, Qt::blue);
Painter.strokePath(OuterPath.simplified(), QPen(Qt::black, 1));
Painter.strokePath(InnerPath, QPen(Qt::black, 3));
}

关于c++ - 如何使用 QPainter 或 QPainterPath 使用一个形状或一组连接的形状在 Qt 中绘制自定义形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com