[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