I'm having trouble using QNetworkAccessManager to download anything, I create the QNetworkRequest and pass it to QNetworkAccessManager::get, but nothing happens, the finished signal never calls the function I connected (onFinished), and I even created a while loop after calling QNetworkAccessManager::get that checks QNetworkReply::isFinished every 500ms, but it always returns false and the progress is always 0 of 0. I called QNetworkReply::error which returns NoError but nothing seems to be working . I also tried disabling my firewall and antivirus in case they were blocking traffic but that didn't change anything, and the QWebView I'm also using in the app works fine so it shouldn't be a problem with connecting to the internet.
Can anyone help me? I'm using Qt 5.1.1 and the url I'm using is just "http://google.com" which I figure shouldn't cause any problems.
Below is the code for the class I created to test out how this stuff works and which I'm having problems with, please ignore the poor design of the code, it's just testing code to see how things work so I have a better idea how to fit it into the application.
Class declaration:
class FileDownloader
: public QObject{
Q_OBJECT
public:
FileDownloader
(QObject* parent
= 0);
~FileDownloader();
void DownloadToFile(const QString& url, const QString& file);
public slots:
void onFinished(QNetworkReply* reply);
private:
QNetworkRequest* m_networkRequest;
QNetworkAccessManager* m_networkManager;
QNetworkReply* m_reply;
};
class FileDownloader : public QObject
{
Q_OBJECT
public:
FileDownloader(QObject* parent = 0);
~FileDownloader();
void DownloadToFile(const QString& url, const QString& file);
public slots:
void onFinished(QNetworkReply* reply);
private:
QNetworkRequest* m_networkRequest;
QNetworkAccessManager* m_networkManager;
QNetworkReply* m_reply;
QString m_file;
};
To copy to clipboard, switch view to plain text mode
Implementation:
FileDownloader
::FileDownloader(QObject* parent
){
m_reply = NULL;
m_networkManager = new QNetworkAccessManager(this);
QObject::connect(m_networkManager,
SIGNAL(finished
(QNetworkReply
*)),
this,
SLOT(onFinished
(QNetworkReply
*)));
}
FileDownloader::~FileDownloader()
{
delete m_networkManager;
}
void FileDownloader::DownloadToFile(const QString& url, const QString& file)
{
m_networkRequest
= new QNetworkRequest
(QUrl(url
));
m_reply = m_networkManager->get(*m_networkRequest);
m_file = file;
while (m_reply->isFinished() == false)
{
Sleep(500);
char buffer[256];
qint64 done = 0;
qint64 total = 0;
m_reply->downloadProgress(done, total);
QNetworkReply::NetworkError error = m_reply->error();
sprintf_s(buffer, 256, "Data: %d/%d\n%s\n", done, total, m_reply->errorString().toStdString().c_str());
OutputDebugStringA(buffer);
}
}
void FileDownloader::onFinished(QNetworkReply* reply)
{
QFile outputFile
= m_file;
outputFile.
open(QFile::WriteOnly);
outputFile.write(reply->readAll());
outputFile.close();
}
FileDownloader::FileDownloader(QObject* parent)
: QObject(parent)
{
m_reply = NULL;
m_networkManager = new QNetworkAccessManager(this);
QObject::connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*)));
}
FileDownloader::~FileDownloader()
{
delete m_networkManager;
}
void FileDownloader::DownloadToFile(const QString& url, const QString& file)
{
m_networkRequest = new QNetworkRequest(QUrl(url));
m_reply = m_networkManager->get(*m_networkRequest);
m_file = file;
while (m_reply->isFinished() == false)
{
Sleep(500);
char buffer[256];
qint64 done = 0;
qint64 total = 0;
m_reply->downloadProgress(done, total);
QNetworkReply::NetworkError error = m_reply->error();
sprintf_s(buffer, 256, "Data: %d/%d\n%s\n", done, total, m_reply->errorString().toStdString().c_str());
OutputDebugStringA(buffer);
}
}
void FileDownloader::onFinished(QNetworkReply* reply)
{
QFile outputFile = m_file;
outputFile.open(QFile::WriteOnly);
outputFile.write(reply->readAll());
outputFile.close();
}
To copy to clipboard, switch view to plain text mode
Bookmarks