Qt QNetworkAccessManager始终返回空数据,状态代码为0

时间:2016-05-17 12:30:07

标签: c++ qt qnetworkaccessmanager

我遇到了一个奇怪的问题,我搜索了几个小时但找不到解决方案。

我正在使用Qt编写Windows桌面应用程序,我想从Internet下载文件,因此我使用QNetworkAccessManager。以下是我的测试代码,它位于MainWindow的构造函数中:

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并且无重定向。即使我的PC已从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();
}

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

好的,我找到了问题所在。我必须使用http://www.exmaple.org而非www.example.org,否则QNAM将报告ProtocolUnknownError错误。我假设QNAM会猜测协议类型。但遗憾的是它不会。

答案 2 :(得分:0)

如果在URL中使用https协议,则应在可执行文件旁边添加以下dll文件。

的libeay32.dll ssleay32.dll