[PyQt] Pixel size issues with QPainter, QLabel and QSvg

matameko info at matameko.de
Mon Aug 6 13:21:06 BST 2012


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.


More information about the PyQt mailing list