【问题标题】:How to restore resource.qrc file from resources_rc.py如何从 resources_rc.py 恢复 resource.qrc 文件
【发布时间】:2017-12-31 13:41:31
【问题描述】:

由于我面临数据丢失,当我尝试恢复它时,我有一个损坏的 resource.qrc 文件,并且我还丢失了我的图形文件(.png、.jpg) - 但我的 Qt 应用程序运行良好。

问题是当我需要编辑.ui 文件时,我的resource.qrc 文件已损坏。我的resources_rc.py 文件一切正常,我通过以下命令创建:

pyrcc4 -o resource.py resource.qrc

那么有什么办法可以从resources_rc.py 文件中取回我的resource.qrc 吗?

【问题讨论】:

    标签: python pyqt resources restore pyrcc


    【解决方案1】:

    下面的脚本将从pyrcc生成的resources_rc.py文件中重建一个qrc文件和所有原始资源。它适用于 PyQt4/5 和 Python 2/3。这些文件将被写入与给定 resources_rc.py 文件位于同一目录中的临时目录。

    用法:

    python qrc_gen.py path/to/resources_rc.py
    

    qrc_gen.py

    import sys, os, tempfile
    import sip
    sip.setapi('QString', 2)
    from PyQt4 import QtCore
    # from PyQt5 import QtCore
    
    respath = os.path.abspath(sys.argv[1])
    dirpath = os.path.dirname(respath)
    sys.path.insert(0, dirpath)
    
    import resources_rc
    
    tmpdir = tempfile.mkdtemp(prefix='qrc_', dir=dirpath)
    
    it = QtCore.QDirIterator(':', QtCore.QDirIterator.Subdirectories)
    
    files = []
    
    while it.hasNext():
        uri = it.next()
        path = uri.lstrip(':/')
        if path.startswith('qt-project.org'):
            continue
        tmp = os.path.join(tmpdir, path)
        if it.fileInfo().isDir():
            try:
                os.makedirs(tmp)
            except OSError:
                pass
        else:
            res = QtCore.QFile(uri)
            res.open(QtCore.QIODevice.ReadOnly)
            with open(tmp, 'wb') as stream:
                stream.write(bytes(res.readAll()))
            res.close()
            files.append('    <file>%s</file>\n' % path.lstrip(':/'))
    
    with open(os.path.join(tmpdir, 'resources.qrc'), 'w') as stream:
        stream.write('<!DOCTYPE RCC><RCC version="1.0">\n')
        stream.write('<qresource>\n%s</qresource>\n' % ''.join(files))
    

    【讨论】:

    • 了不起的人,除了这里,我在任何地方都找不到解决问题的方法。伟大的工作,非常感谢你再次帮助我大声笑。 @ekhumoro
    • 出于好奇,是否也可以从app.py 文件中恢复app.ui 文件?因为我也无法在任何地方找到与此相关的任何内容@ekhumoro
    • @Aadit。很难恢复完整的原件。 this answer中给出了部分解决方案。
    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 2012-10-06
    • 2019-08-12
    • 2010-09-11
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多