使用PyQt 5生成的应用程序引用图片资源主要有两种方法,第一种方法是将资源文件转换为 Python 文件,然后引用 Python 文件;第二种方法是在程序中通过相对路径引用外部图片资源。由于第一种方法会涉及Qt Designer,所以放在本章介绍;对于第二种方法,使用起来非常简单,读者可以查看第4章中的案例4-7。下面详细介绍第一种方法的实现过程。
在Qt Designer中设计界面时是不能直接加入图片和图标等资源的,而是需要在PyQt开发目录下编写.qrc文件(可以用文本编辑器打开扩展名为.qrc的资源文件)。
(1)新建一个资源文件apprcc.qrc,它的内容如下:
﹤rcc version="1.0"﹥
﹤qresource﹥
﹤/qresource﹥
﹤/rcc﹥
也可以使用Eric创建这个文件,操作如图3- 69所示。然后在弹出的窗口中新建文件apprcc.qrc就可以了,它会自动帮你生成上面的代码。
图3-69
(2)打开 Qt Designer,新建一个类型为 Widget 的简单窗体,该窗体文件名为MainWin02.ui。然后打开资源浏览器,按图3-70所示进行操作(本例涉及的图片在PyQt5/Chapter03/images目录下)。
图3-70
首先进入资源编辑界面,然后打开资源文件,这里打开上面创建的资源文件apprcc.qrc。接下来选中apprcc.qrc,设置图片资源的前缀为 pic。最后添加或删除图片资源。
按照以上步骤添加图片资源后,用文本编辑器查看 apprcc.qrc 文件,发现它是XML格式的。
﹤RCC﹥
﹤qresource prefix="pic"﹥
﹤file﹥images/cartoon1.ico﹤/file﹥
﹤file﹥images/cartoon2.ico﹤/file﹥
﹤file﹥images/cartoon3.ico﹤/file﹥
﹤file﹥images/cartoon4.ico﹤/file﹥
﹤file﹥images/python.jpg﹤/file﹥
﹤/qresource﹥
﹤/RCC﹥
继续使用 Qt Designer 操作 MainWin02.ui 文件。在 Qt Designer 窗口左侧,将Display Widgets栏中的Label控件拖到窗体Form中间并选中它,然后在Qt Designer窗口右侧的属性编辑器中找到pixmap属性,单击其后面的按钮,把它的值改为资源文件中的一张图片,如图3-71所示。
使用pyuic5命令将.ui文件转换为.py文件。
pyuic5-o MainWin02.py MainWin02.ui
图3-71
本例文件名为PyQt5/Chapter03/MainWin02.py,其完整代码如下:
from PyQt5 import QtCore,QtGui,QtWidgets
class Ui_Form(object):
def setupUi(self,Form):
Form.setObjectName("Form")
Form.resize(678,431)
self.label=QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(80,30,531,321))
self.label.setText("")
self.label.setPixmap(QtGui.QPixmap(":/pic/images/python.jpg"))
self.label.setObjectName("label")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self,Form):
_translate=QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form","Form"))
import apprcc_rc
为了使窗口的显示和业务逻辑分离,再新建一个调用窗口显示的文件 CallMain Win02.py,其完整代码如下:
import sys
from PyQt5.QtWidgets import QApplication ,QMainWindow
from MainWin02 import Ui_Form
class MyMainWindow(QMainWindow,Ui_Form):
def __init__(self,parent=None):
super(MyMainWindow,self).__init__(parent)
self.setupUi(self)
if __name__=="__main__":
app=QApplication(sys.argv)
myWin=MyMainWindow()
myWin.show()
sys.exit(app.exec_())
运行 CallMainWin02.py 文件,会抛出如下异常信息,提示在 MainWin02.py 中找不到模块apprcc_rc。
Exception "unhandled ImportError"
No module named 'apprcc_rc'
这说明在脚本中使用以下代码导入的模块异常。
import apprcc_rc
调用脚本还差关键的一步,就是将.qrc文件转换为.py文件,然后导入正常的.py资源文件。
使用PyQt 5提供的pyrcc5 命令将apprcc.qrc文件转换为apprcc_rc.py文件(之所以添加_rc,是因为 Qt Designer 导入资源文件时默认是加_rc 的,这里是为了与Qt Designer一致)。
pyrcc5 apprcc.qrc-o apprcc_rc.py
转换完成后,在同级目录下会多出一个与.qrc 文件同名的.py 文件。查看apprcc_rc.py文件,其内容如下:
可以看出,该文件已经使用QtCore.qRegisterResourceData 进行了初始化注册,所以可以直接引用该文件。
在界面文件MainWin02.py中,需要使用以下代码直接导入.py资源文件。
import apprcc_rc
在 Qt Designer 中使用图片资源时,图片资源的引入路径是冒号“:”加图片的路径,示例代码如下:
:/pic/images/python.jpg
注意到上面的路径与 qrc 文件的路径稍微有些不同,多了一个前缀“pic”,原因是Qt Designer会自动根据qrc中的qresource标签来调整这个路径。如图3-72所示,在qresource标签中有一个“pic”属性,Qt Designer会自动把“pic”添加到图片路径images/python.jpg中。
图3-72 apprcc_rc.qrc文件
修改后的MainWin02.py文件的完整代码如下:
from PyQt5 import QtCore,QtGui,QtWidgets
class Ui_Form(object):
def setupUi(self,Form):
Form.setObjectName("Form")
Form.resize(678,431)
self.label=QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(80,30,531,321))
self.label.setText("")
self.label.setPixmap(QtGui.QPixmap(":/pic/images/python.jpg"))
self.label.setObjectName("label")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self,Form):
_translate=QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form","Form"))
import apprcc_rc
运行CallMainWin02.py文件,显示效果如图3-73所示。
图3-73
运行脚本一切正常,可以在窗口中看到所导入的图片资源。