2013-07-24 9 views
6

Ich möchte Text mit QPainter zeichnen, und ich möchte zuerst QPainterPath verwenden (weil ich schließlich den Text auf alle möglichen Arten drehen möchte). Ich finde jedoch, dass der von QPainterPath produzierte Text viel hässlicher ist als der von QPainter produzierte Text.Text von QPainter viel schöner als von QPainterPath

Der folgende Code:

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(); 
} 

erzeugt das folgende Ergebnis:

enter image description here

Ersteres ist eindeutig viel sauberer und schöner, vor allem in kleineren Schriften. Was soll ich tun, um das gleiche Ergebnis von QPainterPath zu bekommen?

Ich produziere die obigen Ergebnisse auf einem Windows 7 Computer, mit Qt 5.0.

Antwort

5

Nach der Qt-Dokumentation für Text zu einem QPainterPath Zugabe: -

Fügt den gegebenen Text auf diesen Weg als eine Reihe von geschlossener Subpfade erstellt aus der Schrift geliefert.

So gibt es hier eine Konvertierung, weshalb es nicht gleich aussieht. Wenn Sie Text drehen müssen, können Sie versuchen, den QPainter vor dem Rendern zu drehen und anschließend wieder zu restaurieren. Wenn Sie stattdessen QGraphicsView und QGraphicsDisplay verwenden können, anstatt nur auf das Widget zu rendern, gibt es die Klasse QGraphicsTextItem, die hilfreich sein kann.

Aber insgesamt ist es die Umwandlung in die Menge der geschlossenen Unterpfade, die für die unterschiedliche Ausgabe der Textqualität verantwortlich ist.

+0

Recht, zumindest ich, was Sie meinen, dass es eine Umwandlung los ist, obwohl ich verstehe nicht, was das bedeutet in der Praxis (geschlossene Subpfade?), und wenn es etwas ist, das kann Gemieden werden. Leider macht das Drehen von 'QPainter' zuerst die Sache schlimmer, weil Anti-Aliasing für gedrehten Text nicht unterstützt wird. – Yellow

+0

Ich weiß, dass es Java ist, aber die Antwort auf diese Frage erläutert kurz Unterpfade: http://StackOverflow.com/Questions/4662295/what-is-path-subpath-in-java2d – TheDarkKnight

+0

Wie zu fragen, ob es vermieden werden kann, wenn Sie verwenden QPainterPath, ich glaube nicht, dass Sie genau das gleiche Ergebnis erhalten. Möglicherweise können Sie einige der Renderinghintergründe für den Maler festlegen, z. B. QPainter :: TextAntialiasing. Beachten Sie, dass es sich um Flags handelt, die in Kombination verwendet werden können. – TheDarkKnight

1

Die beiden Schriftarten sehen nicht gleich aus, weil Sie dem QPainterPath-Text zusätzliche Konturen hinzufügen. Das folgende Stück Code sollte gute Ergebnisse:

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(); 

Ich gebe zu, dass QPainterPath Text „Hallo World 3“ ist ein wenig hässliche, dass QPainterText „Hallo Welt 1“, aber das Ergebnis ist immer noch besser als „Hallo World 2"

enter image description here

Verwandte Themen