免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7827 | 回复: 0
打印 上一主题 下一主题

PyQt/Qt中使用image [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-22 23:23 |只看该作者 |倒序浏览

                      最近做网络爬虫,收获很多,等国庆写一个比较完整的总结。今天先把这些天使用PyQt的一些小地方记录一下。
      Qt中使用图片资源,用得最多的就是图标了。静态图标或者图片一般这样加载:
      1. 编写qt resource文件,格式大致如下      //--------------------images.qrc----------------------//
       !DOCTYPE RCC>RCC version="1.0">
       qresource
prefix="/">
            file>images/quit.png/file>
            file>images/login.png/file>
            file>images/open.png/file>
      /qresource>
      /RCC>
      2. 使用pyrcc4编译qt resource,生成py文件(如果是C++版本的话,使用rcc)
      pyrcc4 images.qrc -o images_rc.py
      3. 在程序中import images_rc,然后就可以使用了,  比如,为open菜单添加一个图标      self.actionOpen = QtGui.QAction(self)
self.actionOpen.setIcon( QtGui.QIcon(":/images/open.png") )
      这种方法的特点就是肯定不会出错,即使用py2exe打包后,而且兼容性很好。但是不足是程序会变大,因为图片资源都静态编译到二进制程序中去了。
      另外一种加载图片或者图标的方法是我在做QZone的爬虫时遇到的问题:登陆QZone需要验证码,验证码可以通过访问腾讯的固定网址刷新,通过python的urllib/urllib2可以很容易下载下来手动输入,但是需要做到GUI里面的话,因为图片随时可以刷新,就不能编译成静态的二进制了。查了一下Qt的文档,发现QPixmap这个类可以直接从硬盘上的文件加载,文档中是这样描述的:
      ----------------------------------------------------------      
     QPixmap::QPixmap ( const
QString
& fileName, const char * format = 0,
Qt::ImageConversionFlags
flags = Qt::AutoColor )
      Constructs a pixmap from the file with the given fileName. If the file does not exist or is of an unknown format, the pixmap becomes a null pixmap.
      ...
      The file name can either refer to an actual file on disk or to one of the application's embedded resources. See the
Resource System
overview for details on how to embed images and other resource files in the application's executable.
      ----------------------------------------------------------
      这个fileName既可以是qt resource的文件,也可以是一个物理文件,所以就解决了我的问题:我先将验证码下载下来,然后实例化一个QPixmap对象,生成一个QIcon,添加到一个Button上就可以了:
pixmap = QtGui.QPixmap( 'verifcode.jpg' )
icon =
QtGui.QIcon( pixmap )
self.verifCodeButton.setIcon( icon )
      不过后来发现QPixmap还有两个重载的函数loadFromData:   
      bool
loadFromData
( const uchar * data, uint len, const char * format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor )
      bool
loadFromData
( const QByteArray & data, const char * format = 0, Qt::ImageConversionFlags flags= Qt::AutoColor )
      因为我从url请求得到的图片数据本来就是二进制的数据,先是通过write生成jpg文件,再用QPixmap加载的,能不能直接把从url请求得到的数据直接load进去呢?因为第一个函数需要知道字节长度,查了下QByteArray的定义,我选择第二个函数,结果一试就成功啦,代码如下:
pixmap = QtGui.QPixmap()
imgdata = self.reqVerifCode()   # req the image data of verify
code
bool = pixmap.loadFromData( QtCore.QByteArray(imgdata) )
if bool:
    icon
= QtGui.QIcon( pixmap )
    self.veriCodeButton.setIcon( icon )
else:
    QtGui.QMessageBox.warning( None, u'警告',
                    u"加载验证码失败" )
      正当我高兴之余,用py2exe打包后,发现我的button显示不出来图片,我开始以为程序有问题,但是直接用python.exe来执行明明就work得很好的。在确定代码没有问题后,我开始怀疑自己的setup.py有问题,我不确定是不是缺了某些库没加进去。于是Google之,关键词'py2exe Pixmap',相关信息较少,不过这个问题貌似有人碰到过,昨晚试了好几种方法,都没有得到解决。今天终于在
这个地址
找到了解决办法:
      You may try creating folder "imageformats" in the folder with
your binary app and add DLLs from PyQt4 imageformats folder (
C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats\.
)
      就是把PyQt4\plugins\imageformats\文件夹复制到你py2exe打包后可执行文件的目录下,其实我后来发现,imageformats里有6个dll文件,分别是qgif4.dll,qico4.dll,qjpeg4.dll,qmng4.dll,qsvg4.dll和qtiff4.dll,我猜想都是些使用图片资源需要的动态链接库,只需要保留qjpeg4.dll就可以了,因为我的验证码使用的是jpg的格式。修改setup.py文件后重新打包,至此,该问题得以圆满解决。
      先show一下我的QTricker:

还有我的RTK

     
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/85537/showart_2058001.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP