C++ Qt 下载网络视频

本文详细介绍了如何在Qt中利用QNetworkAccessManager和QNetworkReply类下载网络视频,包括文件路径获取、请求处理、进度显示、超时控制和错误处理等关键步骤。
摘要由CSDN通过智能技术生成

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值