2013-07-24 5 views
6

QPainterを使用してテキストを描きたいので、QPainterPathを最初に使用します(最終的にはあらゆる種類のテキストを回転させたいからです)。しかし、私はQPainterPathによって生成されたテキストがQPainterによって生成されたテキストよりもはるかに醜いことがわかります。QPainterからのテキストがQPainterPathよりもずっと良かった

次のコード:

enter image description here

前者が特に小さいフォントで、明らかに非常にクリーンとよりよいです:

void MyWidget::paintEvent(QPaintEvent* /*event*/) { 

    QFont font; 
    font.setStyleHint(QFont::Times, QFont::PreferAntialias); 
    font.setPointSize(30); 

    QPainter painter; 
    painter.begin(this); 
    painter.setRenderHint(QPainter::Antialiasing); 
    painter.setBrush(Qt::black); 
    painter.setFont(font); 
    painter.drawText(10, 40, "Hello World"); 

    QPainterPath textPath; 
    textPath.addText(10, 100, font, "Hello world"); 
    painter.drawPath(textPath); 

    painter.end(); 
} 

には、以下の結果が得られます。 QPainterPathから同じ結果を得るにはどうすればよいですか?

私は上記の結果をWindows 7コンピュータでQt 5.0で生成しています。 QPainterPathにテキストを追加するためのQtのドキュメントによれば

答えて

5

: - 閉じたサブパスのセットが供給されるフォントから を作成したとして

は、このパスに指定されたテキストを追加します。

ここでは変換が行われているため、同じようには見えません。テキストを回転する必要がある場合は、レンダリングする前にQPainterを回転させてから、それを復元することができます。代わりに、単にウィジェットにレンダリングする代わりにQGraphicsViewとQGraphicsDisplayを使うことができれば、QGraphicsTextItemクラスが役に立ちます。

しかし全体的に、それは、テキスト品質の異なる出力を担当する閉じたサブパスのセットへの変換です。

+0

右2" と、それはそれができるものなら世界避けてください。残念ながら、 'QPainter'を回転させると、アンチエイリアスは回転したテキストには対応していないので、まず悪いことになります。 – Yellow

+0

私はそれがJavaだと知っていますが、この質問の答えは簡単にサブパスを説明しています:http://stackoverflow.com/questions/4662295/what-is-path-subpath-in-java2d – TheDarkKnight

+0

避けることができるかどうかを尋ねると、あなたはQPainterPathを使用していますが、まったく同じ結果が得られるとは思いません。あなたは、QPainter :: TextAntialiasingのような、それを改善するかもしれないペインタのレンダーヒントのいくつかを設定することができます。それらはフラグであり、組み合わせて使用​​できることに注意してください。 – TheDarkKnight

1

余分な輪郭をQPainterPathテキストに追加しているため、2つのフォントが同じに見えません。コードの 以下の部分は良好な結果を与える必要があります。

QFont font; 
font.setStyleHint(QFont::Times, QFont::PreferAntialias); 
font.setPointSize(30); 

QPainter painter; 
painter.begin(this); 
painter.setRenderHints(QPainter::TextAntialiasing | QPainter::Antialiasing); 
painter.setFont(font); 

// painter text color is modified by setPen() 
painter.setPen(Qt::white); 
painter.drawText(10, 40, "Hello World 1"); 

QPainterPath textPath; 
textPath.addText(10, 100, font, "Hello World 2"); 

// painter path text color is modified by setBrush() 
painter.setBrush(Qt::white); 
// setPen(Qt::white) add extra white contour on text path (what you did) 
painter.setPen(Qt::white); 
painter.drawPath(textPath); 

QPainterPath textPath2; 
textPath2.addText(10, 160, font, "Hello World 3"); 

// painter path text color is modified by setBrush 
painter.setBrush(Qt::white); 
// setPen(Qt::NoPen) avoid extra contours for QPainter Path 
painter.setPen(Qt::NoPen); 
painter.drawPath(textPath2); 

painter.end(); 

私はQPainterPathテキスト「Hello Worldの3が」そのQPainterText「Hello Worldの1」少し醜いですが、結果はまだこんにちは」よりも優れていることを認めます私はこれが実際に何を意味するのか分かりませんが、少なくとも私は(閉じサブパス?)、あなたが起こって変換があることを意味するものを見る

enter image description here

関連する問題