使用QPainter :: drawText()时,文本不是抗锯齿的吗?

时间:2016-06-17 09:07:05

标签: qt pyqt qpainter qt5.5

当我尝试使用QPainter::drawText()绘制文字时,文字没有抗锯齿(与MS词相比)

void TextLabel::paintEvent(QPaintEvent*) {
    QPainter p(this);
    p.setRenderHint(QPainter::TextAntialiasing);

    QFont font;
    font.setFamily("Roboto medium");
    font.setPointSize(32);
    font.setStyleHint(QFont::Helvetica, QFont::PreferAntialias);

    p.setPen(_brush);
    p.setFont(font);

    p.drawText(rect(), Qt::AlignLeft , _text);
}

Qt Doc说:

QPainter :: TextAntialiasing - >表示引擎应该抗锯齿文本如果可能

这不可能吗? 我该怎么办?

单词一词:

enter image description here

Qt one:

enter image description here

2 个答案:

答案 0 :(得分:0)

尝试通过QImage进行绘画 - QPainter::TextAntialiasing更有可能被尊重。

QImage image(size(), QImage::Format_ARGB32_Premultiplied);
{
  QPainter p(&image);
  p.setRenderHint(QPainter::TextAntialiasing);

  QFont font;
  font.setFamily("Roboto medium");
  font.setPointSize(16);
  font.setStyleHint(QFont::Helvetica, QFont::PreferAntialias);

  p.setPen(_brush);
  p.setFont(_font);

  p.drawText(rect(), Qt::AlignLeft , _text);
}
QPainter p(this);
p.drawImage(rect(), image);

注意:如果这样做,那么使用的QImage可能应该是私有类成员,而不是每次调用paintEvent时重新创建它。

答案 1 :(得分:0)

似乎问题是Qt在Window OS(字体渲染)上使用并使用某些字体> = 48pt并且不能与其他字体一起使用。

问题:https://bugreports.qt.io/browse/QTBUG-40052

我们希望他们能在不久的将来解决这个问题。

您可以使用QPainterPath进行绘制,但价格更贵但仍有帮助:

void TextLabel::paintEvent(QPaintEvent*) {
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(Qt::black);

    QFont font;
    font.setPointSize(38);
    font.setFamily("Roboto");

    painter.setFont(font);

    painter.drawText(0, 60, "Google");

    QPainterPath textPath;
    textPath.addText(0, 140, font, "Google");
    painter.drawPath(textPath);
}

Roboto @ 38pt:

enter image description here