Fontgröße auf verschiedenen Rechnern unterschiedlich

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo,
Ich habe ein Programm mit Qt 4.8 und PySide geschrieben, dabei wird Text in eine GraphicsScene gesetzt.

Ein und dasselbe Programm
bei mir unter Debian/Linux-> funktioniert
im Nachbarzimmer unter Windows 7 Home -> funktioniert
bei meinem Kollegen unter Windows 7 Prof. -> falsche Schriftgröße !

Alle Schriften sollen in der Größe 10 dargestellt werden, auch die Fontmetric rechnet mit 10, wie es sein soll, angezeigt wird aber auf dem einen Rechner (vermutlich) in Größe 12 was dazu führt, dass die Zeichen ineinander laufen.

Nicht nur in der Graphik, auch im TextEdit-Bereich ist die schrift zu groß.


Ich habe schon die ganze Anwendung mit app.setFont=QtGui.QFont('Helvetica', 10) auf 10 gesetzt, keine Verbesserung.

Hat jemand sowas schon mal gehabt und gibt es dafür einen Workaround?
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Kannst du den Code verfügbar machen? Dann teste ich es hier auch mal jeweils unter Windows 7 x86/x64 und Xubuntu.
Prinzipiell sollte bei gleicher Font die gleiche Größe bei der Rasterisierung auftreten. Wenn allerdings sogar ein normales TextControl eine größere Font verwendet, liegt es schwerlich am Code.

Andere Tools oder Python-Programme laufen ohne vergrößerte Schrift?
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Ich hab noch mal nachgesehen. Die Schriftgröße im TextControl scheint doch in Ordnung.

Es betrifft nur den GraphicScene-Bereich.

Der Kollege arbeitet mit 2 Bildschirmen, vielleicht kommt Qt dabei durcheinander? Ich kann das jetzt aber nicht auseinanderstöpseln um zu testen, ob es daran liegt.

Ich habe die Schriftgröße im Python-Programm auf dem betreffenden Rechner mal von 10 auf 8 geändert. Jetzt kommt alles so hin, wie es sein soll. Als Workaround geht das erst mal, schön ist aber was anderes.

Ich melde mich noch mal, wenn ich mehr testen konnte.
BlackJack

Vielleicht liegt es auch an den Windows-Einstellungen? Oder mischst Du vielleicht Schriftgrössen in `pt` und andere Grössen in Pixeln? Eine 10 pt grosse Schrift sagt nichts darüber wie gross die in Pixeln ist! Das hängt vom Umrechnungsfaktor vom Betriebs- beziehungsweise Fenstersystem ab und was das denkt was für eine Auflösung in PPI die Anzeige hat.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Hase hat geschrieben:Der Kollege arbeitet mit 2 Bildschirmen, vielleicht kommt Qt dabei durcheinander?
Das halte ich für unwahrscheinlich. Ich entwickle und betreue mehrere unserer Multi-Screen Tools (jeweils für Windows/Linux) und konnte mich bisher über keinerlei Probleme hinsichtlich Qt+Fonts beklagen. Auch mit mehreren GraphicScenes war bisher alles konsistent.

Falls du ein Repro findest, wäre ich persönlich sehr daran interessiert, zu erfahren, wie/wann/wo sich das Problem äußert. Und welche Schritte/Codelines den Fehler produzieren.
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Hallo,
ich bin gerade etwas entsetzt, ich befürchte, ich habe eine schweren Fehler gemacht. Aber der Reihe nach...
Das vollständige Programm zu schicken geht schlecht, das hat über 1000 Zeilen. Anbei ein Minimalbeispiel mit dem, was ich meine:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

from PySide import QtCore, QtGui


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.graphicsView = QtGui.QGraphicsView(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(230, 130, 256, 192))
        self.graphicsView.setObjectName("graphicsView")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))



class ControlMainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(ControlMainWindow, self).__init__(parent)
        
        ui = Ui_MainWindow()
        ui.setupUi(self)
        ui.graphicsView.setScene(QtGui.QGraphicsScene(self))
        ui.graphicsView.setSceneRect(QtCore.QRectF(-100,-100,200,200))
        
        pen=QtGui.QPen()
        pen.setWidth(1.)
        rect=QtGui.QGraphicsRectItem(0, 0,30,30)
        rect.setPen(pen)
        
        text_display="-10,5"
        
        text=QtGui.QGraphicsSimpleTextItem(text_display)
        font = QtGui.QFont('Helvetica', 10, QtGui.QFont.Normal)
        fm=QtGui.QFontMetrics(font)
        fmwidth=fm.width(text_display)
        print fmwidth
        
        text.setPos(0,0)
        text.setFont(font)


        ui.graphicsView.scene().addItem(text)
        ui.graphicsView.scene().addItem(rect)

   
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    mySW = ControlMainWindow()
    mySW.show()
    sys.exit(app.exec_())



Es zeigt ein Rechteck, darin steht eine Zahl. An meinem Bildschirm ist fmwidth=29, die Zahl steht vollständig innerhalb des Rechtecks.
Bei meinem Kollegen ist fmwidth=38, die Zahl geht deutlich über den Rand des Rechtecks hinaus, was nicht akzeptabel ist.
Ich dachte immer, das sind Scene-Units und unabhängig vom Bildschirm. So würde das bedeuten, dass die gesamte Graphik noch mal auf den Text skaliert werden muss, ja? Ist das ein Bug oder ein Feature? Wie löst man das ab besten? Gibt es einen Zusammenhang zwischen Scene-Units und der Font-Größe?

Danke.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Getestet auf Windows7 und Xubuntu, beide Male steht der Text exakt im Rechteck, beide Male ist fmwidth = 29.
Das sind die Pixel die bei der Rasterisierung belegt werden, keine SceneUnits. Wenn bei deinem Kollegen also fmwidth = 38, dann werden da aus irgendwelchen Gründen 38 Pixel für den Text benötigt.

Welches OS ist das? Eventuell hat Helvetica dort per Standard ein anderes Letter-Spacing oder ähnliches!? Kannst du 2 Screenshots der beide unterschiedlichen Ansichten posten? Dann könnte man das visuelle Resultat mal auswerten.

EDIT:
Wenn das Problem nicht über die Font-Settings lösbar ist, könntest du zumindest das Rectangle in seiner Breite auf fmwidth setzen. Damit wäre immerhin gewährleistet, dass der Text immer im Rechteck liegt. Das resultiert dann zwar in unterschiedlich großen Rechtecken auf verschiedenen OS, ich denke aber, das wäre einem Text-Overflow vorzuziehen.
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

so, hoffentlich klappt das.


das ist mit fmwidth=29 wie es sein soll:
http://www.directupload.net/file/d/3501 ... nv_png.htm

und das mit fmwidth=38
http://www.directupload.net/file/d/3501 ... cu_png.htm

Das System mit fmwidth=38 ist ein Windows 7 Professional SP1.
Wenn man statt 'Helvetica' 'Arial' angibt, ändert sich nichts. Wenn man die Schriftgröße von 10 auf 8 ändert, so ist fmwidth=29 (!)
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Okay, die Schriftgröße ist ja deutlich unterschiedlich. Ich teste das heute Abend noch mal zuhause, habe dort noch einen alten Laptop mit WinXP rumliegen.
BlackJack

Ich versuche es noch mal: Wenn die Schriftgrösse in pt (point) angegeben wird, dann ist das eine physikalisch absolute Grösse. 10 pt sind ungefähr 3,5 Millimeter. Wieviele Pixel man benötigt um einen 3,5 Millimeter grossen Buchstaben anzuzeigen hängt von der Bildschirmauflösung in pixel per inch (PPI) ab, also von der physikalischen Grösse des Bildschirms und wie viele Pixel horizontal und vertikal angezeigt werden. Windows nannte die PPI in der entsprechenden Einstellung glaube ich DPI und *die* Einstellung ist dafür verantwortlich wieviele Pixel eine x pt grosse Schrift unter Windows einnimmt.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

BlackJack hat geschrieben:Ich versuche es noch mal...
Sarkasmus ... irgend jemand erfüllt doch immer das letzte Prozent. Fühl dich bitte nur nicht zu irgend etwas genötigt. :roll:


@Hase
Ich gehe naiv davon aus, dass die PPI in allen Fällen die gleiche ist, sprachen wir doch nur von Windows. Da setze ich hier einfach die 96dpi voraus. Deswegen fragte ich ja nach dem OS, du hättest ja auch auf MacOS testen können, das hätte die Differenz eventuell sofort erklärt.
Die Doku verrät, dass QFont() tatsächlich mit Punkten arbeitet, und nicht, wie ich vorhin fälschlicherweise annahm, mit Pixelangaben. Wie erwartet hat der Test auf meinem Laptop (1024x600pxl) kein anderes Bild gezeigt, der Text ist weiterhin einwandfrei im Rechteck.
Sirius3
User
Beiträge: 18229
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hase: ein Design, das auf Pixelgrößen angewiesen ist, ist bei den heutigen Displaygrößen und -auflösungen eine schlechte Idee. Hast Du Dir schonmal überlegt, warum »QFont« sowohl ein setPointSize als auch setPixelSize hat?
BlackJack

@Madmartigan: Kann man bei Windows immer noch von ”festen” 96 DPI ausgehen, egal was da für ein Monitor dran hängt? Ich könnte es jetzt nicht beschwören, aber ich bin ziemlich sicher dass ich das letzte mal als ich dem Dialog war etwas gesehen habe was auch tatsächlich zur Hardware passte. Und zwar ohne das das jemand manuell geändert hat.
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

@Sirius3
Wieso auf Pixelgrößen angewiesen? Wo benutze ich denn Pixel? Die Fontgröße ist in Points, die Grafik in Scene-Units bzw. im Scene-Koordinatensystem. Die GraphicsScene ist ja gerade dazu da, eben nicht auf physikalische oder logische Bildschirmpixel angewiesen zu sein, so meine ich es jedenfalls aus der Doku heraus gelesen zu haben.
Deshalb war ja meine Frage: gibt es einen Zusammenhang zwischen Scene-Units und Font-Points?
Tut mir leid, ich verstehe die Aussage nicht. Wie zeichnet man denn auf einer GraphicsScene?
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

BlackJack hat geschrieben:@Madmartigan: Kann man bei Windows immer noch von ”festen” 96 DPI ausgehen, egal was da für ein Monitor dran hängt? Ich könnte es jetzt nicht beschwören, aber ich bin ziemlich sicher dass ich das letzte mal als ich dem Dialog war etwas gesehen habe was auch tatsächlich zur Hardware passte. Und zwar ohne das das jemand manuell geändert hat.
Ich kann es auch nicht beschwören und meine Tests reichen sicher nicht für eine gesicherte Statistik. Aber auf den Systemen hier hatte ich immer die gleiche Anzeige seines Beispiel-Codes.

Acer One: 1024x600 auf WinXP x86 Prof SP3
Notebook: 1280x720 auf Xubuntu
"Render-Knecht": 19" CRT 1280x1024 auf Win7 x64 Ultimate
Workstation: 2x 1920x1200 + 1x 1280x1024 auf Win7 x64 Ultimate

Ich hab jetzt nicht geschaut, wie Xubuntu werkseitig konfiguriert ist. Allerdings verraten die Einstellungen unter WinXP, das 96ppi verwendet werden. Unter Win7 wird per Standard WinXP PPI Scaling ergo ebenfalls 96ppi verwendet. Inwieweit da nun diverse Monitore nebst ihrer Funktionsweise relevant sind, vermag ich als Hardware-Laie nicht zu beurteilen.

Hase hat geschrieben:@Sirius3
Wieso auf Pixelgrößen angewiesen? Wo benutze ich denn Pixel? Die Fontgröße ist in Points, die Grafik in Scene-Units bzw. im Scene-Koordinatensystem. Die GraphicsScene ist ja gerade dazu da, eben nicht auf physikalische oder logische Bildschirmpixel angewiesen zu sein, so meine ich es jedenfalls aus der Doku heraus gelesen zu haben.
Deshalb war ja meine Frage: gibt es einen Zusammenhang zwischen Scene-Units und Font-Points?
Tut mir leid, ich verstehe die Aussage nicht. Wie zeichnet man denn auf einer GraphicsScene?
Deine Scene-Units sind nichts anderes als feste Größen, nicht etwa Koordinaten wie unter OpenGL. Du kannst natürlich trotzdem im Double-Format arbeiten, kannst also dein Rechteck jederzeit um x.yz verschieben, was in Pixel scheinbar keinen Sinn macht aber bei der Rasterisierung berücksichtigt wird.
Ein 10x10 pxl großes Rechteck wird immer die gleiche Größe haben, egal welches Display, egal welche Auflösung! Bei niedrigen Auflösungen hast du also ein großes Rechteck, bei großen Auflösungen dagegen ein kleines.
Das meinte Sirius eventuell.
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Uiuiui,

ich habe, da mein Kollege gerade nicht da ist, dort mal den 2. Monitor ausgestöpselt, und sieh da: jetzt geht es auch dort: fmwidth=29.

Ich betrachte das Problem erst mal als gelöst, wenn auch nicht befriedigend.
Weiterhin bleibt festzustellen: Das Zusammenspiel zwischen physikalischen und logischen Pixeln, Zeicheneinheiten, der tatsächlichen Darstellung, absoluten Größen wie pt etc. und dem maßstäblichen Drucken (hier noch gar nicht besprochen) ist, wenn man ins Detail geht, alles andere als trivial.

Vielen Dank für die Diskussion.
BlackJack

Also unter Linux wird normalerweise versucht die tatsächlichen PPI zu ermitteln. Die nötigen Informationen haben auch schon Röhrenmonitore geliefert, also denke ich mal das bei aktuellen Flachbildschirmen auch alle Rechner das in der Regel erlauben. Aus meiner ``/var/log/Xorg.0.log``:

Code: Alles auswählen

[    34.772] (**) intel(0): Display dimensions: (350, 190) mm
[    34.772] (**) intel(0): DPI set to (116, 120)
Sirius3
User
Beiträge: 18229
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hase: wie schon gesagt, man darf halt nicht verschiedene Maßsysteme mischen. Entweder gibt man alle Einheiten in Pixel oder in physikalischen Einheiten (mm, pt, dd, AE) an.
Bei Win7 gibt es die Vergrößerungsstufe 125% was mit Deiner Beobachtung übereinstimmen würde.
Hase
User
Beiträge: 103
Registriert: Donnerstag 1. Oktober 2009, 15:17
Wohnort: Bremer Speckgürtel

Sirius3 hat geschrieben:@Hase: wie schon gesagt, man darf halt nicht verschiedene Maßsysteme mischen. Entweder gibt man alle Einheiten in Pixel oder in physikalischen Einheiten (mm, pt, dd, AE) an.
Bei Win7 gibt es die Vergrößerungsstufe 125% was mit Deiner Beobachtung übereinstimmen würde.
Ja, wie denn? Qt bietet mir das doch gar nicht an. Die graphischen Zeichenelemente (Linien, Rechtecke, ...) sind in GraphicsScene-Units anzugeben, die Schriftgröße in pt. Da habe ich doch schon zwei Systeme. Wenn du weißt, wie es geht, sag es bitte!

Das geschilderte Problem war m.E. hier: Zwei Monitore mit vermutlich verschiedenen Auflösung, und Qt macht somit unbeabsichtigt eine falsche Annahme.
Antworten