为什么我的.qrc资源文件中的文件显示为空?

时间:2016-03-16 19:34:48

标签: c++ qt qml qt5

我正在尝试从.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)):“scenegraph”

     

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);

显式初始化资源文件

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

1 个答案:

答案 0 :(得分:0)

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

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

这是我的certs文件,没有'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在一般情况下工作!