2013-02-26 79 views
2

我试图让我的应用程序从一个URL下载文件,通常是一个EXE或JAR,并不是说这应该改变很多。我把这一切都运行在一个线程中,但我不认为这会有所作为(如果它让我知道)。Qt下载文件 - QNetworkAccessManager,没有获取数据

所以Do_Download是我的函数,它创建管理器,设置URL和请求,并执行get。然后我尝试将完成的信号连接到将写入文件的插槽。

void DownloadManager::Do_Download() { 
    QNetworkAccessManager *netManager = new QNetworkAccessManager(this); 
    QUrl url(install_mirror); //istall_mirror is the URL provided by user 
    QNetworkRequest req(url); 

    QNetworkReply *reply = netManager->get(req); 

    connect(reply, SIGNAL(finished()), this, SLOT(writeData())); 
} 

我的writeData函数检查错误,如果没有错误,它会将数据写入文件。

void DownloadManager::writeData() { 
    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); 

    if (reply) { 
     if (reply->error() == QNetworkReply::NoError) { 
      QFile file(location); 
      if(file.open(QIODevice::WriteOnly)) { 
        file.write(reply->readAll()); 
      } else { 
       errorMessage = "Error writing downloaded file for mirror installation"; 
      } 
     } else { 
      //get http status code 
      int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
      errorMessage = "HTTP Error code while downloading from mirror: " + httpStatus; 
     } 

     reply->deleteLater(); 
    } else { 
     errorMessage = "Error downloading file from installation mirror"; 
    } 
} 

问题出在没有数据被写入。它只是创建一个0Kb文件。 我试着添加一个下载进度槽,以便我可以看到接收数据的过程。所以我将其添加到我的Do_Download方法中。

connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(DL_Progress(qint64,qint64))); 

void DownloadManager::DL_Progress(qint64 recieved, qint64 total) { 
    std::cout << recieved << "/" << total << endl; 
} 

输出显示一个时间为0/01

我在做什么错?

+0

你有QCoreApplication对象和事件循环执行? – 2013-09-27 09:22:30

回答

1

我在你的代码中看到的唯一问题是你没有等待下载完成。 NetworkRequest对象将在函数调用结束时被破坏。

所以,我会改写Do_Download像这样(QEventLoop syncronizes的网络请求):

void DownloadManager::Do_Download() { 
    QEventLoop eventLoop; 
    QNetworkAccessManager *netManager = new QNetworkAccessManager(this); 
    QUrl url(install_mirror); //istall_mirror is the URL provided by user 
    QNetworkRequest req(url); 

    QNetworkReply *reply = netManager->get(req); 

    connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit())); 
    eventLoop.exec(); 

    writeData(reply); 
} 
相关问题