我有一个应该通过网络下载文件的程序。只要文件很小(<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();
}
}
答案 0 :(得分:3)
阅读QNetworkReply的文档:
QNetworkReply是一个顺序访问QIODevice,这意味着一次 从对象读取数据,它不再由设备保留。它是 因此,应用程序有责任保留此数据 需要。每当从网络接收到更多数据时 处理后,发出readyRead()信号。
因此,只需在下载过程中,只需使用readyRead()信号,即可随时读取QNetworkReply,并写入文件或任何您想要的地方。
您可以在这里找到其他一些信息(特别是Frank Osterfeld的回答):Downloading File in Qt From URL。