2013-07-24 19 views
6

Chcę narysować tekst za pomocą QPainter i chcę najpierw użyć QPainterPath (ponieważ ostatecznie chcę obrócić tekst na wszystkie sposoby). Jednak uważam, że tekst wyprodukowany przez QPainterPath jest znacznie brzydszy niż tekst wyprodukowany przez QPainter.Tekst z QPaintera o wiele ładniejszy niż z QPainterPath

Poniższy kod:

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

produkuje następujące wyniki:

enter image description here

Były to wyraźnie znacznie czystsze i ładniejsze, szczególnie w mniejszych czcionek. Co powinienem zrobić, aby uzyskać ten sam wynik z QPainterPath?

Produkuję powyższe wyniki na komputerze z Windows 7, z Qt 5.0.

Odpowiedz

5

Zgodnie z dokumentacją Qt do dodawania tekstu do QPainterPath: -

Dodaje podany tekst do tej drogi jako zbiór zamkniętych podścieżek stworzony z czcionki dostarczone.

Tak więc trwa konwersja, dlatego nie wygląda tak samo. Jeśli potrzebujesz obrócić tekst, możesz spróbować obrócić QPaintera przed renderowaniem, a następnie przywrócić go. Alternatywnie, jeśli możesz używać QGraphicsView i QGraphicsDisplay zamiast renderowania na widget, istnieje klasa QGraphicsTextItem, która może pomóc.

Ogólnie rzecz biorąc, konwersja na zbiór zamkniętych ścieżek podrzędnych jest odpowiedzialna za różne wyniki jakości tekstu.

+0

Prawo, przynajmniej widzę co masz na myśli, że nie jest to konwersja dzieje, chociaż nie rozumiem, co to oznacza w praktyce (zamknięte podścieżki?), a jeśli jest to coś, co może być unikanym. Niestety, rotacja 'QPaintera' najpierw pogorszy sprawę, ponieważ wygładzanie nie jest obsługiwane w przypadku tekstu obróconego. – Yellow

+0

Wiem, że to Java, ale odpowiedź na to pytanie krótko wyjaśnia ścieżki podrzędne: http://stackoverflow.com/questions/4662295/what-is-path-subpath-in-java2d – TheDarkKnight

+0

Jeśli chodzi o pytanie, czy można tego uniknąć, używasz QPainterPath, nie sądzę, że otrzymasz dokładnie taki sam wynik. Być może uda Ci się ustawić niektóre typy renderowania, które mogą je ulepszyć, takie jak QPainter :: TextAntialiasing. Zwróć uwagę, że są to flagi, więc można ich używać w połączeniu. – TheDarkKnight

1

Dwie czcionki nie wyglądają tak samo, ponieważ dodajesz dodatkowe kontury tekstu QPainterPath. Poniższy fragment kodu powinien dać dobre rezultaty:

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

muszę przyznać, że tekst QPainterPath „Hello World 3” jest trochę brzydsze że QPainterText „Hello World 1”, ale wynik jest jeszcze lepszy niż „Hello Świat 2"

enter image description here