Hello, I compared the pixel size of some line and text elements that I created with QtSvg and QtGui (QPainter and QLabel). I use python xy, version 2.7.2.3 (with Qt version 4.7.4) on win7. The pixel size of both approaches (QSvg vs. QtGui) should be the same, but it is different: http://python.6.n6.nabble.com/file/n4984221/comparison.png
There are several issues: 1. In the example below I specify the text size for the Font that I use with the QLabel in pt: self.MyFont.setPointSize(FontSize) #,where FontSize = 30 However, if I try to specify the size in pixel: self.MyFont.setPixelSize(FontSize) I get following error: QFont::setPixelSize: Pixel size <= 0 (-3000) Is there a bug in MyFont.setPixelSize? Why does it seem to use -3000 instead of 30? Since I did not manage to set the pixel size for the font, I use pt size for the QLabel and for the QSvg text in my example script. 2. If I create a svg line with a length of 10 px and display it on the screen, I get a length of 10 px. However, If i create a line with QPainter that should have a length of 10px, I get a line with 11 px: qp.drawLine(0, 200, 10, 200) http://python.6.n6.nabble.com/file/n4984221/comparison_singel_pixels.png Is there a bug in drawLine ? 3. If I compare the text elements that were created with QLabel and QSvg for the same pt FontSize, I get different results. Why do I get different sized text, for the same pt text size? Since the QSvg element gives the right pixel size for a line (see issue 2.), I guess that the size of the Qsvg text is also right, but that the QLabel gives a wrong text size? 4. How can I get the pixel size of the content of a QSvg element? (I would like to write an equation editor and need the exact sizes of my elements. I tried to calculate the size with fontMetrics. However, since the QtFont and the Svg font sizes are different, this does not work.) Sunny regards, Stefan ========================================================= #!/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4.QtCore import QByteArray from PyQt4.QtCore import QT_VERSION_STR from PyQt4 import QtGui from PyQt4 import QtSvg class BasicWidget(QtGui.QWidget): def __init__(self): super(BasicWidget, self).__init__() self.initUI() def initUI(self): #print qt version print "Qt version:" + QT_VERSION_STR #set window properties self.setGeometry(300, 300, 800, 800) self.setWindowTitle('Ikwed') #Set BackgroundColor colorstr = 'white' widget = self pal = QtGui.QPalette(widget.palette()) pal.setColor(QtGui.QPalette.Background, QtGui.QColor(colorstr)) widget.setPalette(pal) #set svg text properties------------------------------------------------ self.TextString = "slfjksdlfkjsdfl" FontSize = 30 #FontStyle = "normal" #FontWeight = "normal" #LetterSpacing = 0 #WordSpacing = 0 Fill = "#000000" FillOpacity = 0.5 #Stroke = "none" FontFamily = "Times" TextScale=1 """ #translate FontWeight from svg to python-------------------------------- MyWeight = { "lighter": 25, "normal": 50, "bold": 75, "bolder": 87 }[FontWeight] #translate FontStyle from svg to python--------------------------------- MyItalic = { "normal": False, "italic": True, }[FontStyle] """ #get screen resolution-------------------------------------------------- #desc = QtGui.QDesktopWidget() #dpi = desc.physicalDpiY() #create python font----------------------------------------------------- self.MyFont = QtGui.QFont(FontFamily) self.MyFont.setPointSize(FontSize) #MyFont.setWeight(MyWeight) #MyFont.setItalic(MyItalic) #MyFont.setLetterSpacing(0, LetterSpacing) #MyFont.setWordSpacing(WordSpacing) self.setFont(self.MyFont) MyFontMetrics = self.fontMetrics() #pxWidth = MyFontMetrics.boundingRect(TextString).width() self.pxWidth = MyFontMetrics.width(self.TextString) #self.pxHeight = MyFontMetrics.height() print "FontMetricsWidth: " + str(self.pxWidth) #create text with QSvg================================================== SvgTextString = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" + "\n" +\ "<svg>" + "\n" +\ " <text" + "\n" +\ " x=\"0\"" + "\n" +\ " y=\""+ str(FontSize) + "pt\"" +\ " transform=\"scale(" + str(TextScale) + "," + str(TextScale) + ")\"" +\ ">" + "\n" +\ " <tspan " +\ " style=\"" + \ "font-size:" + str(FontSize) + "pt;"+\ "font-family:" + FontFamily + ";" +\ "fill:" + Fill + ";"+\ "fill-opacity:" + str(FillOpacity)+ ";"+\ "\"" +\ ">" + self.TextString + "</tspan>" + "\n" +\ "</text>" + "\n" +\ "</svg>" """ #extra optional format commands "font-style:" + FontStyle + ";"+\ "font-weight:" + FontWeight + ";"+\ "letter-spacing:" + str(LetterSpacing) +"px;"+\ "word-spacing:" + str(WordSpacing) + "px;"+\ "stroke:" + Stroke + ""+\ """ svg = QtSvg.QSvgWidget(self) svg.load(QByteArray(SvgTextString)) svg.move(0,200) #svg.setMaximumSize(svg.sizeHint()) #svg.setMinimumSize(svg.sizeHint()) svg.resize(400, 50) #create line with QSvg ================================================= SvgRectangleString = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" + "\n" +\ "<svg>" + "\n" +\ " <rect" + "\n" +\ "style=\"color:#000000;fill:#000000;fill-opacity:1;stroke:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate\"" + "\n" +\ "id=\"rect3757\"" + "\n" +\ "width=\"" + str(self.pxWidth) + "px\"" + "\n" +\ "height=\"1px\"" + "\n" +\ "x=\"0px\"" + "\n" +\ "y=\"0px\" />" + "\n" +\ "</svg>" svg_rect = QtSvg.QSvgWidget(self) svg_rect.load(QByteArray(SvgRectangleString)) svg_rect.move(0,202) #get svg widht width = svg.__sizeof__() print "svgWidth: " + str(width) #does not give the size of the svg content #create text with QLabel =============================================== self.label = QtGui.QLabel(self) self.label.setFixedSize(400,50) self.setFont(self.MyFont) self.label.setText(self.TextString) self.label.move(0,150) self.show() def paintEvent(self, e): #create line with QPainter ============================================= qp = QtGui.QPainter() qp.begin(self) #brush = QtGui.QBrush(QtCore.Qt.SolidPattern) #qp.setBrush(brush) qp.drawLine(0, 200, self.pxWidth, 200) qp.end() def main(): app = QtGui.QApplication(sys.argv) #app.setOverrideCursor() dummyVariableForWaiting=BasicWidget() sys.exit(app.exec_()) if __name__ == '__main__': main() -- View this message in context: http://python.6.n6.nabble.com/Pixel-size-issues-with-QPainter-QLabel-and-QSvg-tp4984221.html Sent from the PyQt mailing list archive at Nabble.com. _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt