【问题标题】:Unable to access Ssl error list from QNetworkAccessManager无法从 QNetworkAccessManager 访问 Ssl 错误列表
【发布时间】:2012-04-17 18:20:02
【问题描述】:

我正在做一个项目,我试图通过 REST 请求向我们的网络服务发送请求。首先,我只将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:“测试”使用未定义的类“QSslError”
错误 C2440:“正在初始化”:无法从“const QSslError”转换为“int”

错误 C2027:使用未定义类型“QSslError”
错误 C2228: '.toString' 的左边必须有类/结构/联合

此外,IntelliSense 会在 errorstest 下划线并显示以下消息:

IntelliSense:不允许不完整的类型

(请注意,当我这样做时它不会抱怨errors.count()

我在头文件中包含&lt;QSslError&gt;...

我一直在为 sslError 信号苦苦挣扎,几周前我什至无法将信号连接到任何东西,因为它“不存在”。我错过了一个模块还是什么?

感谢您的帮助

编辑:

还是报错:

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

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

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

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

【问题讨论】:

    标签: c++ qt ssl undefined qnetworkaccessmanager


    【解决方案1】:

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

    如果您自己构建 Qt(我也经常忘记那些配置选项),或者您使用 linux 发行版中的 Qt 碰巧在没有 SSL 的情况下构建它(尽管我从未见过),这通常是一个问题.

    编辑: 如果您需要在 windows 上构建它(并且由于某种原因不能使用prebuilt binaries):

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

      c:\root\openssl-1.0.1

      c:\root\qt-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:\root\openssl-1.0.1\include

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

    • 运行 nmake 来构建 Qt 本身

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

    【讨论】:

    • 你知道如何为 windows 构建它吗?看过这么多指南,他们都是不同的......
    【解决方案2】:

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

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

    即只有在编译 Qt 时支持 OpenSSL 时才会声明该信号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 2019-04-11
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多