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?
Fontgröße auf verschiedenen Rechnern unterschiedlich
- 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?
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?
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.
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.
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.
- Madmartigan
- User
- Beiträge: 200
- Registriert: Donnerstag 18. Juli 2013, 07:59
- Wohnort: Berlin
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.Hase hat geschrieben:Der Kollege arbeitet mit 2 Bildschirmen, vielleicht kommt Qt dabei durcheinander?
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.
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:
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.
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.
- 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.
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.
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 (!)
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 (!)
- 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.
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.
- Madmartigan
- User
- Beiträge: 200
- Registriert: Donnerstag 18. Juli 2013, 07:59
- Wohnort: Berlin
Sarkasmus ... irgend jemand erfüllt doch immer das letzte Prozent. Fühl dich bitte nur nicht zu irgend etwas genötigt.BlackJack hat geschrieben:Ich versuche es noch mal...

@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.
@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?
@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.
@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?
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?
- Madmartigan
- User
- Beiträge: 200
- Registriert: Donnerstag 18. Juli 2013, 07:59
- Wohnort: Berlin
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.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.
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.
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.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?
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.
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.
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.
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)
@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.
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!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.
Das geschilderte Problem war m.E. hier: Zwei Monitore mit vermutlich verschiedenen Auflösung, und Qt macht somit unbeabsichtigt eine falsche Annahme.