[Qt] Falsche Ergebnisse bei QFontMetrics



  • Hallo,
    ich möchte mir alle Zeichen aus einem String einzeln auf dem Bildschirm ausgeben lassen, ohne dass sich ihre "bounding rectangles" überschneiden. Deshalb wollte ich mir mit QFontMetrics::boundingRect(QChar) ein Rechteck zurückgeben lassen, das die Pixel eines Zeichens umgibt. Bei den meisten Schriftarten funktioniert das auch, allerdings gibt die Funktion bei der Schriftart "Purisa" (kursiv) ein scheinbar falsches Rechteck zurück. Getestet wurde unter Ubuntu (Jaunty) mit Qt 4.5.1.
    Hier ein Bild, welches das Problem zeigt: http://img17.myimg.de/bitmap66fc7.png
    Das Rechteck entspricht dem QRect, das von boundingRect zurückgegeben wurde und ist identisch mit dem QRect, wenn die Schriftart nicht kursiv geladen wurde.
    Gibt es beim Zeichnen noch etwas zu beachten oder vielleicht einen zuverlässigeren Ersatz für boundingRect?

    Außerdem ist mir aufgefallen, dass bei einigen Zeichen und Schriftarten das zugehörige Rechteck um einen Pixel verschoben ist, sowohl mit als auch ohne Antialiasing. Woran könnte das liegen?

    Vielen Dank schon mal im Voraus!



  • Scheint ein Bug zu sein. Hast du den schon gemeldet?



  • Das Problem wird kein Qt4-hausgemachtes sein. Die verwenden ja auch nur die von X gegebenen Möglichkeiten. Es kann auch sein, dass der Font selber Mist angibt, was die Metrics seiner Zeichen betrifft.

    Wegen dem 1 Pixel Offset:
    -> QFontMetricsF



  • Die verwenden wohl vor allem FreeType. Und warum sollten die nicht dabei auch Fehler machen?



  • Vielen Dank für eure Antworten.
    Wie es aussieht, besteht der Fehler auch unter Windows. Auch hier ist das QRect, das von boundingRect zurückgegeben wird, oft 1-2 Pixel verschoben oder zu groß. Auch QFontMetricsF konnte da leider keine Abhilfe schaffen.
    Das Problem habe ich jetzt umgangen, indem ich den Text einem QPainterPath hinzugefügt und diesen schließlich gezeichnet habe.


Anmelden zum Antworten