2016-05-17 16 views
0

私は奇妙な問題を抱えていましたが、何時間も検索しましたが解決策が見つかりませんでした。Qt QNetworkAccessManagerは常に空のデータを返し、ステータスコードは0です

Qtを使用してWindowsデスクトップアプリケーションを作成しています。インターネットからファイルをダウンロードしたいので、QNetworkAccessManagerを使用しています。続いてメインウィンドウのコンストラクタである私のテストコード、次のとおりです。

QNetworkRequest request; 
request.setUrl(QUrl("www.example.org")); 
QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
if(manager->networkAccessible() == QNetworkAccessManager::Accessible){ 
    qDebug() << "Network accessible"; 
} 
else{ 
    qDebug() << "Network is not accessible"; 
} 
manager->get(request); 
connect(manager, manager->finished, this, connFinished); 

をそして次はconnFinished機能です:

void MainWindow::connFinished(QNetworkReply *r){ 
    int statusCode = r->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
    qDebug() << statusCode; 
} 

コードを実行した後、出力は次のとおりです。

Network accessible 
0 

I私のマシンでwww.example.orgにアクセスでき、リダイレクトなしがあることを確かめてください。私のPCがインターネットから切断されても、HTTPステータスコードは0です。問題はまだ新しいプロジェクトで発生するので、このプロジェクトの問題だけではありません。

私Qtのバージョン:Qtの5.5.1(MSVC 2013、32ビット)

コンパイラ:gccのバージョン5.1.0(TDM-1)

が、これはなぜ起こったか誰もが知っているあります?ありがとう!

プロジェクトファイルやコード:

test.pro

QT  += core gui network 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = test 
TEMPLATE = app 


SOURCES += main.cpp\ 
     mainwindow.cpp 

HEADERS += mainwindow.h 

FORMS += mainwindow.ui 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QUrl> 
#include <QNetworkRequest> 
#include <QNetworkReply> 
#include <QNetworkAccessManager> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    void connFinished(QNetworkReply *r); 

private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QDebug> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    QNetworkRequest request; 
    request.setUrl(QUrl("www.example.org")); 
    QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
    if(manager->networkAccessible() == QNetworkAccessManager::Accessible){ 
     qDebug() << "Network accessible"; 
    } 
    else{ 
     qDebug() << "Network is not accessible"; 
    } 
    manager->get(request); 
    connect(manager, manager->finished, this, connFinished); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::connFinished(QNetworkReply *r){ 
    int statusCode = r->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
    qDebug() << statusCode; 
} 

main.cppに

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 
+1

は –

+0

はありがとう...エラーを処理するようにしてください。私は問題を発見した。私は "www.exmaple.org"ではなく "http://www.example.org"を使用しなければなりません... – shell32

答えて

1

QNetworkAccessManager::get()機能を呼び出す前に、信号をスロットに接続する必要があります。

QNetworkRequest request; 
request.setUrl(QUrl("www.example.org"));  
QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(connFinished(QNetworkReply*))); 
manager->get(request); 
+0

うーん、コードを変更しました。しかし結果は変わらない。 :-( – shell32

0

問題がどこにあるかわかりました。 www.example.orgではなくhttp://www.exmaple.orgを使用しなければなりません。そうしないと、QNAMはProtocolUnknownErrorエラーを報告します。私は、QNAMがプロトコルの種類を推測すると仮定しました。しかし、残念ながらそれはしません。

0

URLにhttpsプロトコルを使用する場合は、実行可能ファイルの横に次のdllファイルを追加する必要があります。

libeay32.dll ssleay32.dllを

関連する問題