2016-05-17 385 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 

我確定www.example.org可以在我的機器上訪問,並有沒有重定向。即使我的電腦已斷開與Internet的連接,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

謝謝。我發現了這個問題。我必須使用「http://www.example.org」而不是「www.exmaple.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

好的,我發現問題在哪裏。我必須使用http://www.exmaple.org而不是www.example.org,否則QNAM將報告ProtocolUnknownError錯誤。我認爲QNAM會猜測協議類型。但可悲的是,它不會。

0

如果在您的URL中使用https協議,則應在可執行文件旁邊添加以下dll文件。

的libeay32.dll ssleay32.dll