2011-05-14 7 views
19

Me gustaría usar QWebView para un trabajo de miniaturas de SVG porque admite filtros (a diferencia de QSvgRender, que solo es compatible con SVG Tiny 1.2). Parece funcionar bastante bien, excepto en el caso de la representación de fuentes, pero puede modificarse con el paquete fontconfig. El problema es que parece estar submuestreando elementos con filtros. Los elementos sin filtros se ven bien y nítidos, mientras que aquellos con filtros están pixelados y borrosos.QWebView representación subcompuesta de SVG

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
from PyQt4.QtSvg import * 
from PyQt4.QtWebKit import * 
import sys 
import time 

if __name__ == '__main__': 

    app = QApplication(sys.argv) 

    data = open('/home/xxx/workspace/yyy/zzz/out.svg').read() 

    # svg = QSvgRenderer(QByteArray(data)) 
    qim = QImage(int(1024), int(768), QImage.Format_ARGB32)                                             
    web = QWebView() 
    web.setRenderHint(QPainter.SmoothPixmapTransform) 
    web.setRenderHint(QPainter.Antialiasing) 
    web.setRenderHint(QPainter.TextAntialiasing) 
    painter = QPainter() 

    def load_finished(ok): 
     web.resize(1024,768) 
     painter.begin(qim) 
     # svg.render(painter) 
     web.render(painter) 
     painter.end() 

     print "null:", qim.isNull() 
     qim.save('test2.png') 
     sys.exit() 

    web.connect(web, SIGNAL('loadFinished(bool)'), load_finished) 
    web.load(QUrl('file:///home/xxx/workspace/yyy/zzz/out.svg')) 
    sys.exit(app.exec_()) 

Qt 4.7. El mismo archivo SVG se ve bien cuando se representa con Inkscape, rsvg o en Chrome, Firefox.

result

+3

Usted debe enviar su ejemplo de archivo SVG para las pruebas. – abbot

+0

y url de archivo out.svg. – linjunhalida

Respuesta

1

Pruebe el procesamiento usando QWebPage (el procesador que no es GUI), vea si eso ayuda. No puedo ver ninguna configuración que afecte el renderizado.

Código sería algo como esto (no verificado):

QWebPage page 
QWebFrame frame = page.mainFrame() 
frame.load(url) 
frame.render(painter) 
Cuestiones relacionadas