Текст не сглаживается при использовании QPainter::drawText()?

Пока я пытаюсь нарисовать текст используя QPainter::drawText() текст не сглаживается (по сравнению с MS word)

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 -> Указывает, что движок должен сглаживать текст, если это возможно

Это невозможно? Что я должен делать?

Слово одно:

Qt один:

2 ответа

Кажется, это проблема 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);
}

Робото @ 38pt:

Попробуйте нарисовать через 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.

Другие вопросы по тегам