Qt 中下载网络视频需要用到 QNetworkReply和QNetworkAccessManager两个类
QNetworkAccessManager* m_pManager = nullptr;
QNetworkReply* m_reply = nullptr;
void CNetwork::downLoadVideo(const QUrl& url)
{
if (m_pManager == nullptr)
{
m_pManager = new QNetworkAccessManager(this);
}
QString outputFilePath = QFileDialog::getSaveFileName(nullptr, "下载", ".", "(*.mp4)");
if (outputFilePath.isEmpty())
return;
QNetworkRequest request(url);
m_reply = m_pManager->get(request);
m_outputfile.setFileName(outputFilePath);
if (!m_outputfile.open(QIODevice::WriteOnly))
{
qDebug() << "不能打开该文件";
m_reply->deleteLater();
return;
}
// 创建进度对话框
QProgressDialog progressDialog("Downloading...", "取消", 0, 100);
progressDialog.setWindowModality(Qt::WindowModal);
// 设置超时定时器
QTimer timeoutTimer;
timeoutTimer.setSingleShot(true);
timeoutTimer.start(60000); // 30 seconds timeout
// 连接定时器的槽,用于检查超时
connect(&timeoutTimer, &QTimer::timeout, this, [this, &progressDialog]() {
// 中止下载
m_reply->abort();
qDebug() << "下载超时";
QMessageBox::critical(nullptr, "错误", "下载超时,请检查网络连接。");
// 关闭对话框
progressDialog.reject();
});
connect(m_reply, &QNetworkReply::downloadProgress, this, [this, &progressDialog, &timeoutTimer](qint64 bytesReceived, qint64 bytesTotal) {
if (bytesTotal > 0)
{
int percentage = static_cast<int>((bytesReceived * 100) / bytesTotal);
progressDialog.setValue(percentage);
}
// 重置超时定时器
timeoutTimer.start(60000);
});
// 连接取消按钮的槽
connect(&progressDialog, &QProgressDialog::canceled, this, [this, &timeoutTimer]() {
// 中止下载
m_reply->abort();
timeoutTimer.stop();
});
connect(m_reply, &QNetworkReply::finished, this, [this, &progressDialog, &timeoutTimer]() {
timeoutTimer.stop();
if (m_reply->error() == QNetworkReply::NoError)
{
m_outputfile.write(m_reply->readAll());
m_outputfile.close();
qDebug() << "下载完成";
}
else if (m_reply->error() == QNetworkReply::OperationCanceledError)
{
qDebug() << "下载被取消";
}
else
{
qDebug() << "下载失败:" << m_reply->errorString();
QMessageBox::critical(nullptr, "错误", "下载失败: " + m_reply->errorString());
}
m_reply->deleteLater();
progressDialog.setValue(100);
progressDialog.accept(); // 关闭对话框
});
progressDialog.exec();
}