1

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' の左側には class/struct/union が必要です

また、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 サポートをオンにしてビルドされていることを確認してください (そして、OpenSSL dll が PATH にあることを確認してください)。

これは通常、自分で Qt をビルドした場合 (私はこれらの設定オプションも忘れがちです)、またはたまたま SSL なしで Qt をビルドした Linux ディストリビューションから Qt を使用している場合にのみ問題になります (私はそれを見たことがありません)。

編集: 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 を実行して、ビルドが完了するまで待ちます。

  • 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の他のバージョン用に適切に変更してください)

于 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 に答える