【问题标题】:Why are the files in my .qrc resource file showing up empty?为什么我的 .qrc 资源文件中的文件显示为空?
【发布时间】:2016-03-19 02:20:36
【问题描述】:

我正在尝试从 .qrc 资源文件加载 SSL 证书文件。当我在目录中查询条目列表时,它会显示条目:QStringList apples = QDir (":/").entryList();

其输出为:

D TAPMobile: (null):0 ((null)): "items"

D TAPMobile: (null):0 ((null)): "particleresources"

D TAPMobile: (null):0 ((null)): "粒子"

D TAPMobile: (null):0 ((null)): "plugins"

D TAPMobile: (null):0 ((null)): "qml"

D TAPMobile: (null):0 ((null)): "qt-project.org"

D TAPMobile: (null):0 ((null)): "qtmultimediaquicktools"

D TAPMobile: (null):0 ((null)): "QtQuick"

D TAPMobile: (null):0 ((null)): "场景图"

D TAPMobile: (null):0 ((null)): "shaders"

D TAPMobile: (null):0 ((null)): "SSLcomDVCA_2.crt"

我使用certPath = ":/SSLcomDVCA_2.crt"; // Dev Cert设置证书的路径

我还在 .pro 文件中加载了带有RESOURCES += resources.qrc certs.qrc # uncomment for publishing 的资源文件。

在查看证书路径和证书文件进行调试时,我得到以下信息:http://bit.ly/1MngyId

我还显式地初始化资源文件:Q_INIT_RESOURCE(resources);

这是部署到应用商店之前的最后一个障碍,所以任何帮助都会很棒。谢谢!

【问题讨论】:

    标签: c++ qt qml qt5


    【解决方案1】:

    这是我在其他地方发布的解释的后续,但答案是相关的。它是空的,因为我实际上并没有点击文件所在的正确路径。下面是修复和我对它发生的情况的解释。

    我找到了“问题”和问题的答案。虽然我认为问题可能是 QT 错误或者我对字符串定义的理解是错误的。当我为 dev 和 prod 放置两个证书时,我设置了名为 certs.qrc 的资源文件。我创建了文件定义并使用了通过右键单击资源文件并复制其路径获得的路径。有关 SSL 的完整定义,请参见下文,希望这也可以作为 QT SSL 的示例,因为我也几乎找不到其中任何一个。

    这是我没有“RCC”标头的证书文件,因为它似乎破坏了块引号:

    <qresource prefix="/certs">
        <file>GandiStandardSSLCA2.crt</file>
        <file>SSLcomDVCA_2.crt</file>
    </qresource>
    

    以下是该证书文件的定义:

    // SSL socket set up
    QFile certFile(":/certs/GandiStandardSSLCA2.crt");
    if(certFile.open(QIODevice::ReadOnly))
    {
        qDebug() << "File opened";
    }
    else {
        qDebug() << "Boooo";
    }
    QSslCertificate cert(&certFile, QSsl::Pem);
    forgotPwSocket = new QSslSocket(this);
    forgotPwSocket->addCaCertificate(cert);
    

    所有这些目前都可以正常工作。确保运行 qmake 以编译资源文件。

    现在,我解释一下我为什么会遇到问题。我之前对部署整个资产文件夹的证书使用了不同的部署方法。这适用于Android而不是iOS,所以我决定改用qrc。当我尝试实现 /assets 文件夹部署时,我使用 ifdef 来定义路径的字符串,具体取决于它是 iOS 还是 Android。 我删除了 ifdef,我的所有问题都消失了离开,它现在能够找到路径中的文件。该字符串是我的网络对象的成员,我将在运行时使用 ifdef 定义它。在我所有的调试过程中,它是检查器中显示的正确路径。意识到使用 .qrc 资源消除了基于 Android/iOS 定义路径的需要,我如上所述硬编码了路径值。一旦我这样做了,它就开始工作了。路径名与带有 ifdef 的调试器中的路径名相同,所以我不确定为什么/在哪里中断。如果有人有任何进一步的见解,那就太好了。希望这将帮助任何遇到类似问题或让 SSL 在 QT 中正常工作的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多