无法从QNetworkAccessManager访问Ssl错误列表

Unable to access Ssl error list from QNetworkAccessManager

本文关键字:Ssl 错误 列表 访问 QNetworkAccessManager      更新时间:2023-10-16

我正在进行一个项目,试图通过REST请求向我们的Web服务发送请求。首先,我只将finished(QNetworkReply*)信号连接到插槽,但由于ssl问题,它从未完成,我也尝试连接sslErrors(QNetworkReply*, const QList<QSslError>&)插槽,因为请求是https。

connect(&_accessManager, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), 
        this, SLOT(printSslErrors(QNetworkReply*, const QList<QSslError>&)));

然后在我的打印功能中,我无法以任何方式访问错误列表。

void AssetManager::printSslErrors(QNetworkReply *reply, const QList<QSslError>& errors) {
     ...
}

我试过了:

const QSslError test = errors.at(0); // error on 'test' 
QSslError test = errors.at(0); // error on 'test'

foreach(QSslError error, errors) {
    qDebug() << error.errorString(); // error on 'errors'
}
for(int i = 0; i < errors.count(); i++) {
     qDebug() << errors.at(i).errorString(); // error on 'errors'
}

结果是:

错误C2079:"test"使用了未定义的类"QSslError"
错误C2440:"initializing":无法从"const QSslError"转换为"int"

错误C2027:使用未定义的类型"QSslError"
错误C2228:".toString"的左侧必须具有类/结构/联合

此外,IntelliSense在errorstest下面加上消息:

IntelliSense:不允许使用不完整的类型

(注意,当我做errors.count()时,它没有抱怨)

我在头文件中包含<QSslError>。。。

我一直在努力处理sslError信号,几周前我甚至无法将信号连接到任何东西,因为它"不存在"。我是不是缺了一个模块什么的?

感谢您的帮助

编辑:

仍然得到错误:

对象::connect:没有这样的信号QNetworkAccessManager::sslErrors(QNetworkReply*,const QList&)

此外,无法检查我是否有Ssl

qDebug() << QSslSocket::supportsSsl();

因为QSslSocket是未定义的,即使它包含在内。我一定是错过了什么重要的东西,对吧?我必须安装一些东西吗?我完全迷失在这里:(

确保您的Qt是在启用SSL支持的情况下构建的(并且可以在PATH上找到OpenSSL dll)。

如果你自己构建了Qt(我也经常忘记这些配置选项),或者如果你使用的是linux发行版的Qt,而它恰好是在没有SSL的情况下构建的(尽管我从未见过),这通常只是一个问题。

编辑:如果你需要在windows上构建它(由于某种原因无法使用预构建的二进制文件):

  • 下载OpenSSL和Qt并将其解压缩到同一文件夹中。例如:

    c:rootopenssl-1.0.1

    c:rootqt-everywhere-opensource-src-4.8.1

  • 启动Visual Studio命令行并运行c:\root\openssl-1.0.1\ms\32all.bat,等待构建

  • cd插入c:\root\qt-everywhere-opensource-src-4.8.1并运行

    configure.exe -platform win32-msvc2010 -openssl -I c:rootopenssl-1.0.1include

  • 确保Qt检测到并启用了OpenSSL支持(configure打印出所有内容的列表)

  • 运行nmake来构建Qt本身

(针对VS的其他版本进行适当修改)

我只是遇到了同样的错误,想知道为什么信号无效。如上所述,这确实是因为未启用OpenSSL支持。参见QNetworkAccessManager.h:144:146:

#ifndef QT_NO_OPENSSL
    void sslErrors(QNetworkReply *reply, const QList<QSslError> &errors);
#endif

即,仅当编译Qt时OpenSSL支持到位时才声明该信号。