Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt下载文件-QNetworkAccessManager,未获取数据_C++_Qt_Download_Qnetworkaccessmanager_Qtnetwork - Fatal编程技术网

C++ Qt下载文件-QNetworkAccessManager,未获取数据

C++ Qt下载文件-QNetworkAccessManager,未获取数据,c++,qt,download,qnetworkaccessmanager,qtnetwork,C++,Qt,Download,Qnetworkaccessmanager,Qtnetwork,我试图让我的应用程序从一个URL下载一个文件,通常是一个EXE或一个Jar,但这不应该改变很多。我把这些都放在一个线程中运行,但我不认为这会有什么不同(如果它让我知道的话) Do_Download是我的函数,它创建管理器,设置URL和请求,并执行get。然后,我尝试将完成的信号连接到将写入文件的插槽 void DownloadManager::Do_Download() { QNetworkAccessManager *netManager = new QNetworkAccessMan

我试图让我的应用程序从一个URL下载一个文件,通常是一个EXE或一个Jar,但这不应该改变很多。我把这些都放在一个线程中运行,但我不认为这会有什么不同(如果它让我知道的话)

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";
    }
}
void DownloadManager::writeData(){
QNetworkReply*reply=qobject_cast(发送方());
若有(答复){
如果(回复->错误()==QNetworkReply::NoError){
QFile文件(位置);
if(file.open(QIODevice::WriteOnly)){
write(reply->readAll());
}否则{
errorMessage=“写入镜像安装下载文件时出错”;
}
}否则{
//获取http状态代码
int-httpStatus=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
errorMessage=“从镜像下载时的HTTP错误代码:”+httpStatus;
}
回复->删除稍后();
}否则{
errorMessage=“从安装镜像下载文件时出错”;
}
}
问题是没有写入任何数据。它只是创建了一个0Kb的文件。 我尝试添加一个下载进度槽,以便查看接收数据的情况。所以我把这个添加到我的Do_下载方法中

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;
}
connect(应答,信号(下载进度(qint64,qint64)),这个,插槽(DL_进度(qint64,qint64));
无效下载管理器::DL_进度(收到qint64,总计qint64){

std::cout我在代码中看到的唯一问题是您没有等待下载完成。NetworkRequest对象将在函数调用结束时被销毁

因此,我会像这样重写Do_Download(QEventLoop同步网络请求):


您是否有正在执行的QCoreApplication对象和事件循环?
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);
}