2017-09-25 10 views
2

위젯에 텍스트를 수직이 아닌 각도, 즉 0과 90 사이의 각도로 그립니다. 텍스트 자체를 그리는 데는 문제가 없지만, 결과 텍스트는 매우 위글/고르지 않게 그려집니다.qt - 수직이 아닌 각도로 QPainter :: rotate가 울퉁불퉁 한 선을 만듭니다.

아래 그림에서 나는 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

앤티 앨리어싱을 사용할 수 있으며 전체 문자열을 그립니다. – 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); 

EDIT이다.

전 :

Before, buggy text

후 :

After, correct text

+0

결과를 이미지로 추가 하시겠습니까? 이 해결 방법이 제공하는 개선점이 얼마나 많은지 궁금합니다. – AMA

+1

@AMA, 편집 참조. – edvardsp