2010-06-29 93 views
0

我意识到这样的具体问题并不好,但我花了好几天的时间来解决这个问题。希望这里有人能帮忙。QSvgRenderer分段错误

使用PyQt4的这Python代码导致分段故障:

data = """<?xml version="1.0" ?> 
      <svg height="1000" width="2000"> 
       <text>blah</text> 
      </svg>""" 

svg = QSvgRenderer(QByteArray(data)) 
qim = QImage(int(width), int(height), QImage.Format_ARGB32) 
painter = QPainter() 

painter.begin(qim) 
svg.render(painter) 
painter.end() 

qim.save('test2.png') 

引起故障是svg.render(painter)线。

故障点在libQtGui.so(所以在QPainterQImage)。

返回Trueqim.isNull()返回False

+0

你可以尝试在C++中编码等价物以查看它是否工作?这会告诉你错误是在Qt还是在PyQt4中。那么,如果你没有得到一个好的答案,你可以前往适当的邮件列表或支持论坛或任何他们有什么。 – 2010-06-29 20:52:15

+0

这是一个好主意,我不认为它可能是PyQt特有的。 – colinmarc 2010-06-29 20:56:29

+0

你在运行什么操作系统? 你有什么版本的PyQt4? 这是来自py2exe打包的exe文件还是只是在解释器中运行? – Nathan 2010-06-29 21:10:17

回答

0

只需做一些小改动(定义宽度和高度),它就可以适用于我。请注意,我没有看到任何文字,但是如果我将数据换成我知道有效的数据,它就可以完美地工作。这里是我的完整代码:

#!/usr/bin/env python 

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

if __name__ == '__main__': 

    app = QApplication(sys.argv) 

    data = """... (my valid svg) ...""" 

    svg = QSvgRenderer(QByteArray(data)) 
    qim = QImage(int(2000), int(1000), QImage.Format_ARGB32)                                             
    painter = QPainter() 

    painter.begin(qim) 
    svg.render(painter) 
    painter.end() 

    print "null:", qim.isNull() 
    qim.save('test2.png') 
+1

我缺少的部分是声明一个'QApplication'。相当令人沮丧,尤其是因为在我阅读的'QImage','QPainter'或'QSvgRenderer'文档中没有提到这个要求。 – colinmarc 2010-06-29 22:21:17

0

试着让它在QPixmap而不是QImage上绘制。

Qt偶尔会导致段错误,我通常只是围绕它们编码。 也许你可以在Gimp中栅格化这个SVG并加载它。

+0

我会放弃它,但为什么? – colinmarc 2010-06-29 21:32:03

+0

我得到“QPixmap:必须在QPaintDevice之前构造一个QApplication”。另外,该文档还说“QImage是为I/O设计和优化的,并且可以直接进行像素访问和操作,而QPixmap则是为屏幕上显示图像而设计和优化的。” – colinmarc 2010-06-29 21:38:41

+0

为了回应你的编辑,我这样做的原因是以编程方式栅格化svg。我不在乎创建一个Qt应用程序。我会使用'rsvg',但它不支持''元素。查看http://stackoverflow.com/questions/3119882/ – colinmarc 2010-06-29 21:41:47