无法使用Qt下载>= 1GB 的文件

Cannot download files >= 1GB with Qt

本文关键字:1GB 文件 gt Qt 下载      更新时间:2023-10-16

我有一个程序,应该通过网络下载文件。只要文件很小(<1GB),一切都很好。但是,当文件大于 1GB 时,会发生以下两种情况之一:
a) 如果我将来自 QNetworkReply 的信号与下载进度连接到我的一个插槽,应用程序崩溃并显示 std::bad_alloc
b) 如果我没有连接来自 QNetworkReply 的任何信号,应用程序将在 73% 时停止。
任何帮助都非常感谢。
这是我在连接和插槽中使用的代码:

QNetworkReply* reply = network_access_manager_->get(request);
    connect(reply,SIGNAL(downloadProgress(qint64,qint64)),parent_,SLOT(downloadProgress(qint64,qint64)));  

这是插槽:

void MainWindow::downloadProgress(qint64 bytesReceived,qint64 bytesTotal)
{
    try
    {
    ui->label->setText(QString::number(bytesReceived));
    ui->label_2->setText(QString::number(bytesTotal));
    ui->progressBar->setRange(0,bytesTotal);
    ui->progressBar->setValue(bytesReceived);
    }
    catch(std::exception& e)
    {
        qDebug() << e.what();
    }
}

阅读 QNetworkReply 的文档:

QNetworkReply 是一个顺序访问 QIODevice,这意味着一旦 数据是从对象中读取的,它不再由设备保存。是的 因此,应用程序有责任保留此数据,如果它 需要。每当从网络接收更多数据时,并且 处理后,发出 readyRead() 信号。

因此,只需在下载过程中随时使用 readyRead() 信号从 QNetworkReply 读取,然后写入文件或任何您想要的地方。

在这里你可以找到一些其他的信息(特别是阅读Frank Osterfeld的答案):从URL下载Qt中的文件。