Не удалось получить доступ к списку ошибок SSL из QNetworkAccessManager

Я работаю над проектом, в котором пытаюсь отправить запрос на наш веб-сервис через запросы 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'

or

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»

or

ошибка C2027: использование неопределенного типа "QSslError"
ошибка C2228: слева от ".toString" должен быть class/struct/union

также, что IntelliSense подчеркивает errors или test сообщением:

IntelliSense: неполный тип не допускается

(Обратите внимание, что он не жалуется, когда я делаю errors.count())

Я включаю <QSslError> в файл заголовка...

Я довольно много боролся с сигналом sslError, и несколько недель назад я даже не смог подключить сигнал к чему-либо, поскольку он «не существует». Я пропустил модуль или что-то?

Спасибо за вашу помощь

Редактировать:

Все еще получаю ошибку:

Object::connect: Нет такого сигнала QNetworkAccessManager::sslErrors(QNetworkReply*, const QList&)

Кроме того, не могу проверить, есть ли у меня SSL

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

Поскольку QSslSocket не определен, даже если он включен. Это должно быть что-то важное, что мне здесь не хватает, верно? Должен ли я что-то установить? Я тут совсем запутался :(


person chikuba    schedule 04.04.2012    source источник


Ответы (2)


Убедитесь, что ваш Qt собран с включенной поддержкой SSL (и что DLL OpenSSL можно найти в PATH).

Обычно это проблема только в том случае, если вы собрали Qt самостоятельно (я тоже часто забываю об этих параметрах конфигурации) или если вы используете Qt из дистрибутива Linux, который случайно собрал его без SSL (хотя я никогда этого не видел).

РЕДАКТИРОВАТЬ: Если вам нужно собрать его в Windows (и вы не можете использовать готовые двоичные файлы почему-то):

  • Загрузите и распакуйте OpenSSL и Qt в ту же папку. Например:

    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 (configure распечатывает список всего)

  • запустить nmake для сборки самого Qt

(изменить соответствующим образом для других версий VS)

person Eugene    schedule 04.04.2012
comment
Вы знаете, как построить его для окон? видел столько гайдов и все они разные... - person chikuba; 10.04.2012

У меня была такая же ошибка, и я задавался вопросом, почему сигнал недействителен. Как указано выше, это действительно так, поскольку поддержка OpenSSL не включена. См. QNetworkAccessManager.h:144:146:

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

то есть сигнал объявляется только в том случае, если поддержка OpenSSL была на месте при компиляции Qt.

person darrenp    schedule 18.06.2012