1

我正在做一个项目,我试图通过 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:'test' 使用未定义的类 'QSslError'
错误 C2440:'initializing':无法从 'const QSslError' 转换为 'int'

或者

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

此外,IntelliSense 强调errorstest带有以下消息:

IntelliSense:不允许不完整的类型

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

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

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

谢谢你的帮助

编辑:

仍然收到错误:

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

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

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

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

4

2 回答 2

5

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

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

编辑:如果您需要在 Windows 上构建它(并且由于某种原因不能使用预构建的二进制文件):

  • 下载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进行适当修改)

于 2012-04-04T05:27:24.070 回答
0

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

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

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

于 2012-06-18T16:42:57.640 回答