qt 使用 QPainterPath 绘制轮廓文本
qt drawing outlined text with QPainterPath
我必须像这样在 QImage 上绘制带轮廓线的划线文本:
我是这样操作的:
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);
得到这个结果:
正如你所看到的,删除线有 zebra-like 填充。我怎样才能用画家的画笔把它填满?
我尝试更改 QPainter 合成模式但没有成功。我也尝试使用 QPainterPathStroker 得到相同的结果。
当然我可以用普通字体(不是删除线)加上矩形画出删除线的文本,但这不是一个很好的解决方案。
解决方案是在有和没有罢工的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();
}
我必须像这样在 QImage 上绘制带轮廓线的划线文本:
我是这样操作的:
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);
得到这个结果:
正如你所看到的,删除线有 zebra-like 填充。我怎样才能用画家的画笔把它填满?
我尝试更改 QPainter 合成模式但没有成功。我也尝试使用 QPainterPathStroker 得到相同的结果。
当然我可以用普通字体(不是删除线)加上矩形画出删除线的文本,但这不是一个很好的解决方案。
解决方案是在有和没有罢工的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();
}