我遇到了一个奇怪的问题,我搜索了几个小时但找不到解决方案。
我正在使用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();
}
答案 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