qt 使用 QPainterPath 绘制轮廓文本

问题描述 投票:0回答:2

我必须在 QImage 上绘制轮廓线删除文本,如下所示:

enter image description here

我这样做:

QPainter painter(this);

QPainterPath path;

QFont font;
font.setPixelSize(95);
font.setStrikeOut(true);
font.setBold(true);

path.addText(10, 150, font, "lololo");

painter.setPen(Qt::blue);
painter.setBrush(Qt::red);

painter.drawPath(path);

并得到这个结果:

enter image description here

正如人们所看到的,勾勒出来的线有斑马状的填充。我怎样才能用画笔把它完全填满?

我尝试更改 QPainter 构图模式,但没有成功。我也尝试使用 QPainterPathStroker 得到相同的结果。

当然,我可以用普通字体(未删除)加上矩形来绘制删除的文本,但这不是一个漂亮的解决方案。

c++ qt qt5 qpainter qpainterpath
2个回答
1
投票

解决方案是在有罢工和无罢工的2条路径之间执行操作:

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QImage image(300, 200, QImage::Format_ARGB32);
    image.fill(Qt::transparent);

    QPoint p(30, 150);
    QString text = "lololo";

    QFont font;
    font.setPixelSize(95);
    font.setBold(true);

    QPainterPath path1;
    font.setStrikeOut(true);
    path1.addText(p, font, text);
    font.setStrikeOut(false);
    QPainterPath path2;
    path2.addText(p, font, text);

    QPainterPath strike = (path1 + path2) - (path1 & path2);
    //                      \---join---/    \-intersection-/
    QPainter painter(&image);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::blue);
    painter.setBrush(Qt::red);
    painter.drawPath(path2);
    painter.drawPath(strike);
    painter.end();

    QLabel w;
    w.setPixmap(QPixmap::fromImage(image));
    w.show();

    return a.exec();
}

enter image description here


0
投票

您可以对路径使用适当的填充规则:

path.setFillRule(Qt::WindingFill);
© www.soinside.com 2019 - 2024. All rights reserved.