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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt 是一个跨平台的应用程序开发框架,它包含丰富的功能模块,其中也包括了用于处理视频的模块。视频时间轴是一种常见的功能,它在处理视频时非常有用。 在 Qt 中,可以使用 QML(Qt中的标记语言)和 C++ 来创建具有视频时间轴的应用程序。下面是一个简单的示例来说明如何使用 Qt 实现视频时间轴功能: 1. 首先,导入 Qt 的相关模块和库,如 QtQuick、QtMultimedia 和 QtQuick.Controls。 2. 创建一个包含视频视图和时间轴的用户界面。可以使用 QML 来定义界面的外观和布局,并将其与后端的 C++ 代码连接起来。 3. 使用 QMediaPlayer 类来加载和播放视频文件。可以设置视频文件的 URL、音量和其他属性。 4. 使用 QML 创建一个时间轴组件,例如使用 Slider 控件。将 Slider 绑定到视频的播放位置,使它能够通过拖动来调整视频的播放进度。 5. 配置时间轴的各种属性,例如设置最小值和最大值、步长和初始值。还可以添加其他样式和行为,如滑块样式、间隔线和提示信息。 6. 将时间轴的值连接到 QMediaPlayer 的 setPosition() 方法,以便在滑块被拖动时调整视频的播放位置。 7. 将播放按钮和暂停按钮与 QMediaPlayer 的 play() 和 pause() 方法连接起来,以便控制视频的播放和暂停。 8. 可以根据需要添加其他功能,如快进、快退、重新播放和全屏等。 通过使用这些步骤,可以在使用 Qt 开发的应用程序中实现视频时间轴功能。这个示例只是一个简单的起点,开发者可以根据实际的需求和设计来扩展和定制。Qt 的强大功能可以帮助开发者轻松实现各种视频处理需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值