Qt的下载文件 - QNetworkAccessManager,没有得到数据(Qt Downloa

2019-07-20 14:12发布

我想有我的应用程序从一个URL下载文件时,通常是EXE或罐,不,这应该有太大变化,虽然。 我有这一切都在一个线程中运行,但我不认为这会有所作为(如果它让我知道)。

所以Do_Download是我的函数创建管理员,设置URL和要求,并执行得到。 然后我试图完成的信号连接到插槽中会写入文件。

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()));
}

我的错误写数据的功能检查,如果没有错误将其写入文件中的数据。

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";
    }
}

在那里的问题是被写入任何数据。 它只是创建了一个文件浏览次数。 我尝试添加下载进度槽,所以我可以看到发生了什么事情recieving数据。 所以我说这我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

我究竟做错了什么?

Answer 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);
}


文章来源: Qt Download File - QNetworkAccessManager, not getting data