- 论坛徽章:
- 0
|
上一篇文章谈到如何让解决Qt中使用jpeg的问题,在我的电脑上,把PyQt4/plugins/imageformats文件夹复制到py2exe打包的可执行文件目录下后,jpeg的验证码显示正常了。可是后来发现copy到别人机器上时,又出现了问题,jpeg格式的验证码还是加载不了,于是又Google之。很多人都遇到过这个问题,说到Qt默认只对png格式支持,对其他图片格式的支持都是通过plugins里面的动态链接库DLL来支持的,所以提出两种办法:
一就是我上述采用的方法了,将PyQt4/plugins/imageformats文件夹复制到py2exe打包的可执行文件目录下,这在我的电脑上时可以正常work的;
二是在py2exe打包的可执行文件目录下建立文件夹PyQt4/plugins/imageformats,然后复制PyQt4/plugins/imageformats下的DLL文件到建立的imageformats下,将安装目录下的qt.conf复制到py2exe打包的可执行文件目录下,然后修改之:
[Paths]
Prefix = ./PyQt4
Plugin = ./PyQt4/plugins
Binaries = .
这两种方法在我的电脑上都是可以正常work的,但是复制到别人的机器上就不能work了,jpeg格式的验证码还是无法显示,郁闷之余,终于找到了一个折中的办法:先用PIL(Python Image Library)将jpeg文件转换成png格式的,然后用Qt直接显示png文件的验证码就没问题了。
不过在转换中还是有问题,就是我的jpeg验证码从url获取的是字符串的格式,如果直接用PIL打需要的是文件或者file对象,所以需要用到StringIO的库,把string转换成文件IO的对象,这样就可以直接用PIL来操作啦,源代码如下:pixmap = QtGui.QPixmap()
jpgdata = self.qzone.reqVerifCode() # request url to get jpeg data
strio = StringIO.StringIO(jpgdata)
img = Image.open(strio)
pngdata = StringIO.StringIO()
img.save( pngdata, format='png') # convert jpeg to png
bool = pixmap.loadFromData( QtCore.QByteArray(pngdata.getvalue()) )
if bool:
icon = QtGui.QIcon( pixmap )
self.veriCodeButton.setIcon( icon )
else:
QtGui.QMessageBox.warning( None, u'警告',
u"加载验证码失败" )
这下再复制到其他电脑上,肯定不会再出现问题啦,也不用打包plugin那些动态库了。虽然麻烦了一点,但是问题最终得到解决~~撒花!
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/85537/showart_2059735.html |
|