2016-05-17 26 views
0

Ich traf ein seltsames Problem und ich habe mehrere Stunden gesucht, kann aber keine Lösung finden.Qt QNetworkAccessManager geben immer leere Daten und der Statuscode ist 0

Ich benutze Qt, um eine Windows-Desktop-Anwendung zu schreiben, und ich möchte eine Datei aus dem Internet herunterladen, so dass ich QNetworkAccessManager verwenden. Im Anschluss ist mein Test-Code, der in der Mainwindow-Konstruktor ist:

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); 

Und nächstes ist connFinished Funktion:

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

Nach Ausführen des Codes, der Ausgang ist:

Network accessible 
0 

I bin sicher, dass auf die www.example.org in meinem gerät zugegriffen werden kann und es gibt keine umleitung. Der HTTP-Statuscode ist 0, auch wenn mein PC die Verbindung zum Internet getrennt hat. Das Problem tritt immer noch in einem neuen Projekt auf, daher ist es nicht nur das Problem dieses Projekts.

Meine Qt-Version: Qt 5.5.1 (MSVC 2013, 32 Bit)

Compiler: gcc Version 5.1.0 (TDM--1)

Gibt es jemand weiß, warum dies geschehen ? Vielen Dank!

Project-Dateien und Code:

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

Versuch, Fehler zu behandeln ... –

+0

Danke. Ich habe das Problem gefunden. Ich muss "http://www.example.org" anstelle von "www.exmaple.org" verwenden ... – shell32

Antwort

1

Vor Aufruf QNetworkAccessManager::get() Funktion müssen Sie es Signale an Steckplatz anschließen.

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

Hmmm, ich habe den Code geändert. Aber das Ergebnis wird nicht geändert. :-( – shell32

0

Okay, ich habe gefunden, wo das Problem liegt. Ich muss http://www.exmaple.org statt www.example.org verwenden, sonst meldet der QNAM einen ProtocolUnknownError Fehler. Ich nahm an, dass die QNAM den Protokolltyp erraten wird. Aber leider wird es nicht.

0

Wenn Sie das https-Protokoll in Ihrer URL verwenden, sollten Sie neben der ausführbaren Datei die folgenden DLL-Dateien hinzufügen.

libeay32.dll ssleay32.dll