安装
pip install pyqt5
和
pip install pyqt5-tools
我们通过 Qt Desigenr 创建一个 qrc 资源文件 保存一张 png 图片
生成的qrc文件内容如下
<RCC>
<qresource prefix="/">
<file>img.png</file>
</qresource>
</RCC>
用 rcc 转化成 py 文件 我们逆向导出后的 py文件 和这个基本是一样的
pyrcc5 img.qrc -o img.py
导出后生成的py内容如下
# -*- coding: utf-8 -*-
# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.7.1)
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore
qt_resource_data = b"\
\x00\x03\x20\x18\
\x89\
\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\............省略
"
qt_resource_name = b"\
\x00\x07\
\x00\x3a\x57\xa7\
\x00\x69\
\x00\x6d\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\
"
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
"
def qInitResources():
QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()
修订一下,部分资源文件是这种
from xqt import QtCore
qt_resource_data = '\x00\x00\x00\x10<\xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\x00\x00\x00\x10<\xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\x00\x00\x00\x10<\xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf........'
qt_resource_name = '\x00\x0c\x05\xefE\x07\x00t\x00b\x00x\x00.....'
qt_resource_struct = '\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00N\x00\x02\x00\x00\x00\x07\x00\x00\x00\t\x00\x00\x00\x1e\x00\x02\....'
def qInitResources():
QtCore.qRegisterResourceData(1, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(1, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()
只需要修改为
from PyQt5 import QtCore #修改
qt_resource_data = b'\x00\x00\x00\x10<\xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\x00\x00\x00\x10<\xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\x00\x00\x00\x10<\xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf........'
qt_resource_name = b'\x00\x0c\x05\xefE\x07\x00t\x00b\x00x\x00.....'
qt_resource_struct = b'\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00N\x00\x02\x00\x00\x00\x07\x00\x00\x00\t\x00\x00\x00\x1e\x00\x02\....'
def qInitResources():
QtCore.qRegisterResourceData(1, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(1, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()
又能愉快的玩耍了
我写了脚本用于遍历提取这个资源py文件的内容
如下
之前代码有问题,修订一下
# !/usr/bin/python
from PyQt5 import QtCore
from PyQt5.QtCore import QFile, QFileInfo,QDir
import img # 引用img.py
def listDir(dir):
print(dir.entryList())
localDir = QDir('./qrc/')
for c in dir.entryInfoList():
print(c.fileName())
if c.fileName() == 'qt' or c.fileName() == 'qt-project.org':
continue
if not c.isDir():
if not localDir.exists(dir.dirName()):
localDir.mkpath(dir.dirName())
ff = c.absoluteFilePath()
print(ff)
QFile.copy(ff, './qrc/' + dir.dirName() + '/' + c.fileName())
continue
iscd = dir.cd(c.baseName())
if iscd:
listDir(dir)
dir.cdUp()
root = QFileInfo(':/')
listDir(root.dir())
执行之后会发现在目录下已经导出了文件