【问题标题】:Text is not antialiased while using QPainter::drawText()?使用 QPainter::drawText() 时文本没有抗锯齿?
【发布时间】:2016-10-19 01:11:19
【问题描述】:

当我尝试使用 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 文档说:

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

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

一个字:

Qt 之一:

【问题讨论】:

  • 我不确定 Qt 是否真的是请求的字体。您可能需要检查“Roboto medium”是否已加载。
  • @JeffreyvandeGlind 。已经用“Times New Roman”测试过,但同样奇怪的问题:(
  • 我没想到更改字体会有所不同,我只是想指出您的程序中可能存在的未被注意的问题。
  • @JeffreyvandeGlind 这只是一个简单的绘画。还有 qDebug()
  • 可以查看是否在QFontDatabase

标签: qt pyqt qpainter qt5.5


【解决方案1】:

尝试通过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 时都重新创建它。

【讨论】:

    【解决方案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:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 2014-02-18
      相关资源
      最近更新 更多