2017-09-25 4 views
2

私はウィジェット上に垂直でない角度、つまり0〜90の角度でテキストを描画しようとしています。テキスト自体を描画することは問題ありませんが、結果として得られるテキストは非常にウイグル/不均一に描画されます。qt - 垂直でない角度でQPainter :: rotateはウィグルラインを発生させます

以下の図では、テキストの行を45度の角度で描画しています。テキストの最初の行は多くのアンダースコア( "_____")で、テキストの2行目は "マルチスレッド"です。問題を強調するためだけの行ではなく、下線が引かれています。

enter image description here

あなたが見ることができるように、明らかに最初の行は、テキストが均等に描かれていない示しています。 2行目では微妙ですが、まだ目に見えます。

垂直角度(0,90,180など)で描画してもこの効果はありません。これが起こっている理由は何ですか?

私はWindows 10でQt 5.7.0を使用しています。

最小限のコードの例:

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

Iは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

関連する問題