[PyQt] changing SVG group rendering color

John Ossenfort johnossenfort at yahoo.com
Sat Apr 17 01:58:38 BST 2010


I came to a similar conclusion, but please let me know if the following is not too 
far-fetched: Because ElementTree stores the XML in memory, is it feasible to 
read in the SVG group contents from file into an Etree element, and then modify 
the color attributes as necessary prior to rendering/painting that element as a 
QGraphicsSvgItem? This is the general direction I was heading because I would 
like to avoid writing out to file if possible.

If feasible, has anyone seen an example of doing such a thing?

Thanks,
John



----- Original Message ----
From: Jason H <scorp1us at yahoo.com>
To: John Ossenfort <johnossenfort at yahoo.com>; pyqt at riverbankcomputing.com
Sent: Fri, April 16, 2010 8:50:23 AM
Subject: Re: [PyQt] changing SVG group rendering color

Qt does not support modifying SVG content (without modifying and reparsing the file)



----- Original Message ----
From: John Ossenfort <johnossenfort at yahoo.com>
To: pyqt at riverbankcomputing.com
Sent: Thu, April 15, 2010 1:37:55 PM
Subject: [PyQt] changing SVG group rendering color

Hi list members!


I've been hacking away at this for quite some time and found no good examples of what I am trying to do on Google, so I hope that someone can point me in the right direction here (I am also very new to Python, so I will also accept ANY tips on pythonic style, code, etc.)

What I want to do is display groups from an SVG file, and then individually and dynamically change the colors for some groups but not others after certain mouse events. My original idea was to read in the groups as QGraphicsSvgItems, render them, and then change the brush colors and redraw them as needed. I'm thinking now that maintaining a reference to the original file precludes any later brush/pen changes unless I use a QSvgGenerator to write out an entirely new SVG file with the color changes embedded! There don't seem to be any functions related to brush color changes for QGraphicsSvgItems to help with this. Another thought was trying to convert the SVG shapes to pixmaps and then applying brush/pen changes, but I have been unable do that as well.

Here is some of my code to hopefully show the direction I have taken:

from xml.etree import ElementTree
from PyQt4 import QtGui
from PyQt4 import QtSvg

class SvgElement(QtSvg.QGraphicsSvgItem):
    def __init__(self, name, renderer):
        QtSvg.QGraphicsSvgItem.__init__(self)
        self.setElementId(name)
        self.setSharedRenderer(renderer)
        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True); 

class SvgViewerPane(QtGui.QGraphicsScene):
    def __init__(self, SVG_FILE, parent=None):
        QtGui.QGraphicsScene.__init__(self, parent)
        self.rend = QtSvg.QSvgRenderer(SVG_FILE)

""" Produce a list of group Elements from the SVG, each containing an id and multiple 'path' attributes """  
tree = ElementTree.parse(SVG_FILE)
makeGroupList(tree.getroot(), group_list)

    for element in group_list:
        n = SvgElement(element.get("id"), self.rend)
        self.addItem(n)

OK, so that works fine to display all the groups and re-build the whole picture in place (I do some additional coding to get the position of each group using a 'renderer.boundsOnElement' call). But now when I want to redraw a group with a color I am at a loss! I tried to overwrite the paint function for SvgElement thinking that if I could render the original image in alternate colors even once it would be a start, but nothing is displayed at all. All attempts to associate a QPainter with each Svg item have failed as well, but probably just due to my lack of understanding ;-)

Any help is much appreciated!
John


      
_______________________________________________
PyQt mailing list    PyQt at riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt


      


More information about the PyQt mailing list