2017-09-25 74 views
2

我试图在非垂直角度(即0和90之间)的角度上绘制小部件上的文本。绘制文本本身不存在问题,但由此产生的文本是非常曲折/不均匀的绘制。qt - QPainter ::以非垂直角度旋转会导致扭曲的线条

在下面的图片中,我正在以45度角绘制文本行。第一行文本是许多下划线(“_____”),第二行文本是“多线程”。下划线是在这里绘制的,而不是为了强调问题。

enter image description here

正如你可以看到,第一行明显显示的文本没有均匀地绘制。这在第二行更加微妙,但仍然可见。

以垂直角度(0,90,180等)绘制不会导致此效果。为什么会发生这种情况?

我正在使用Qt 5.7.0在Windows 10上工作。

最小代码例如:

void MyWidget::paintEvent(QPaintEvent * /* event */) 
{ 
    QFont font; 
    font.setPointSize(16); 
    font.setStyleStrategy(QFont::StyleStrategy::PreferAntialias); 
    setFont(font); 

    QImage image(size(), QImage::Format_ARGB32_Premultiplied); 
    QPainter imagePainter(&image); 
    imagePainter.initFrom(this); 
    imagePainter.setFont(font()); 
    imagePainter.setRenderHint(QPainter::Antialiasing, true); 
    imagePainter.eraseRect(rect()); 
    // Set logical origo in the middle of the image 
    m_window = QRect(
     - width()/2, // x 
     - height()/2, // y 
     width(),  // w 
     height()  // h 
    ); 
    imagePainter.setWindow(m_window); 
    m_viewport = QRect(
     0,    // x 
     0,    // y 
     width(),  // w 
     height()  // h 
    ); 
    imagePainter.setViewport(m_viewport); 

    draw(imagePainter); 
    imagePainter.end(); 

    QPainter widgetPainter(this); 
    widgetPainter.drawImage(0, 0, image); 
} 

void MyWidget::draw(QPainter & painter) 
{ 
    painter.save(); 
    // Rotate anti-clockwise 
    painter.rotate(-m_degrees); 
    painter.drawText(m_window.top(), 0, tr("Multithreads")); 
    painter.drawText(m_window.top(), 15, tr("__________")); 

    painter.restore(); 
} 
+0

你可以尝试使用抗锯齿? –

+0

你一次画字符,还是字符串? – Yakk

+0

Antialiasing已启用,并且正在绘制整个字符串。 – edvardsp

回答

3

我发现一种解决方法从this Qt bug ticket。简而言之,解决方法是将文本绘制为QPainterPath而不是文本。修复的

实施例是

// Do this 
QPainterPath glyphPath; 
glyphPath.addText(x, y, painter.font(), text); 
painter.fillPath(glyphPath, painter.pen().color()); 
// instead of this 
painter.drawText(x, y, text); 

编辑:

的差别在下面可以看到。

之前

Before, buggy text

After, correct text

+0

您可以添加一张图片的结果吗?我很好奇这个解决方案提供了多少改进。 – AMA

+1

@AMA,请参阅编辑。 – edvardsp