Qt媒体播放器实现

本文介绍Qt媒体播放器实现。

Qt应用程序有时会涉及到视频文件的播放,Qt提供了QVideoWidget类实现视频和音频的播放,本文基于QVideoWidget类实现一个简单的媒体播放器。

1.自定义类(基于QVideoWidget类)

由于Qt并未提供专门的控件实现视频的显示,这里需要基于QVideoWidget类自定义一个类,再将拖放的QWidget类提升为自定义的类。这里将其命名为“VideoWidget”类。在使用QVideoWidget类时需在“.pro”文件中添加“multimedia”,“multimediawidgets”,参考代码如下:

QT       += core gui \
            multimedia \
            multimediawidgets

1)头文件

参考头文件如下:

#ifndef VIDEOWIDGET_H
#define VIDEOWIDGET_H

#include <QWidget>
#include <QVideoWidget>
#include <QMediaPlayer>


class VideoWidget : public QVideoWidget
{
    Q_OBJECT
public:
    explicit VideoWidget(QWidget *parent = nullptr);

    ~VideoWidget() override;

public:
    void setMediaPlayer(QMediaPlayer *player);

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void keyPressEvent(QKeyEvent *event) override;

signals:

private:
    QMediaPlayer *mediaPlayer;

public slots:
};

#endif // VIDEOWIDGET_H

2)源文件

参考源文件如下:

#include "videowidget.h"
#include <QEvent>
#include <QKeyEvent>
#include <QMouseEvent>


VideoWidget::VideoWidget(QWidget *parent) : QVideoWidget(parent)
{

}

VideoWidget::~VideoWidget()
{

}

void VideoWidget::setMediaPlayer(QMediaPlayer *player)
{
    mediaPlayer = player;
}

void VideoWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        if (mediaPlayer->state() == QMediaPlayer::PlayingState) {
            mediaPlayer->pause();
        } else {
            mediaPlayer->play();
        }
    }

    QVideoWidget::mousePressEvent(event);
}

void VideoWidget::keyPressEvent(QKeyEvent *event)
{
    if ((event->key() == Qt::Key_Escape) && isFullScreen()) {
        setFullScreen(false);
        event->accept();
    }

    QVideoWidget::keyPressEvent(event);
}

2.界面设计

界面设计如下图:

其中,

视频显示控件“videoWidget”是拖放了一个QWidget控件,然后将此控件提升为前面自定义的类“VideoWidget”。

3.功能实现

1)头文件

参考头文件如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMediaPlayer>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget() override;

public slots:
    void play(void);
    void stop(void);

private:
    Ui::Widget *ui;

private:
     QMediaPlayer *mediaPlayer;
     int m_duration;

private slots:
    void mediaStateChanged(QMediaPlayer::State state);
    void positionChanged(qint64 position);
    void durationChanged(qint64 duration);
    void setPosition(int position);
    void setFullScreen(void);
    void setVolume(int volume);
};
#endif // WIDGET_H

2)源文件

参考源文件如下:

#include "widget.h"
#include "ui_widget.h"
#include <QStyle>
#include <QMouseEvent>
#include <QTime>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_duration = 0;

    mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);

    ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));

    connect(ui->btnPlay, &QAbstractButton::clicked, this, &Widget::play);
    connect(ui->btnFullScreen, &QAbstractButton::clicked, this, &Widget::setFullScreen);
    connect(ui->sldPosition, &QAbstractSlider::sliderMoved, this, &Widget::setPosition);
    connect(ui->sldVolume, &QAbstractSlider::valueChanged, this, &Widget::setVolume);

    mediaPlayer->setVideoOutput(ui->videoWidget);
    ui->videoWidget->setMediaPlayer(mediaPlayer);
    connect(mediaPlayer, &QMediaPlayer::stateChanged, this, &Widget::mediaStateChanged);
    connect(mediaPlayer, &QMediaPlayer::positionChanged, this, &Widget::positionChanged);
    connect(mediaPlayer, &QMediaPlayer::durationChanged, this, &Widget::durationChanged);

    QString curPath = QCoreApplication::applicationDirPath();
    mediaPlayer->setMedia(QUrl::fromLocalFile(curPath + "/" + "test.mp4"));

    ui->sldVolume->setValue(50);

    mediaPlayer->setPlaybackRate(1.0);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::play()
{
    switch (mediaPlayer->state()) {
        case (QMediaPlayer::PlayingState): {
            mediaPlayer->pause();
            break;
        }
        default: {
            mediaPlayer->play();
            break;
        }
    }
}

void Widget::stop()
{
    mediaPlayer->stop();
}

void Widget::mediaStateChanged(QMediaPlayer::State state)
{
    switch(state) {
        case (QMediaPlayer::PlayingState): {
            ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
            break;
        }
        case (QMediaPlayer::StoppedState): {
            ui->sldPosition->setValue(0);
            ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
            break;
        }
        default: {
            ui->btnPlay->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
            break;
        }
    }
}

void Widget::positionChanged(qint64 position)
{
    int temp = 0;

    temp = static_cast<int>(position);
    ui->sldPosition->setValue(temp);

    QString strTime;
    QTime currentTime((temp / 1000 / 3600) % 60, (temp / 1000 / 60) % 60,
                       temp / 1000 % 60, temp % 1000);
    QTime totalTime((m_duration / 1000 / 3600) % 60, (m_duration / 1000 / 60) % 60,
                     m_duration / 1000 % 60, m_duration % 1000);
    QString format = "mm:ss";
    if (m_duration / 1000 > 3600) {
        format = "hh:mm:ss";
    }
    strTime = currentTime.toString(format) + " / " + totalTime.toString(format);
    ui->lbTime->setText(strTime);
}

void Widget::durationChanged(qint64 duration)
{
    m_duration = static_cast<int>(duration);
    ui->sldPosition->setRange(0, m_duration);
}

void Widget::setPosition(int position)
{
    mediaPlayer->setPosition(position);
}

void Widget::setFullScreen()
{
    ui->videoWidget->setFullScreen(true);
}

void Widget::setVolume(int volume)
{
    mediaPlayer->setVolume(volume);
}

其中,

构造函数中媒体播放器绑定了输出控件,输出控件指定了媒体播放器,其他的功能块比较简单,这里不再赘述。

4.效果

运行效果如下:

总结,本文介绍了Qt媒体播放器实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892085.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费绘图软件全解析:让你的创意工作更加高效

在数字化时代&#xff0c;绘图软件已成为我们生活中不可或缺的一部分&#xff0c;无论是业余爱好者还是专业设计师。幸运的是&#xff0c;市面上有许多免费且功能强大的绘图软件可供选择。以下是我们为您精选的8款免费绘图软件&#xff0c;每一款都是精心挑选的&#xff0c;值得…

idea2024启动Java项目报Error running CloudPlApplication. Command line is too long.

idea2024启动Java项目报Error running CloudPlApplication. Command line is too long. 解决方案&#xff1a; 1、打开Edit Configurations 2、点击Modify options设置&#xff0c;勾选Shorten command line 3、在Edit Configurations界面下方新增的Shorten command line选项中…

Midjourney零基础学习

Midjourney学习笔记TOP08 Midjourney的各种参数设置 Midjourney的用户操作界面没有醒目的工具栏、属性栏&#xff0c;所有的操作都是通过调用各种指令和参数进行的。 【质量&#xff08;–quality&#xff09;】 质量&#xff1a;顾名思义就是生成图像的画面细节和品质。 Mid…

Android10 recent键相关总结

目录 初始化流程 点击Recent键流程 RecentsActivity 显示流程 RecentsModel 获取数据管理类 RecentsActivity 布局 已处于Recent界面时 点击recent 空白区域 点击返回键 recent组件配置 Android10 Recent 功能由 System UI&#xff0c;Launcher共同实现。 初始化流程 …

数据结构之顺序表——动态顺序表(C语言版)

静态顺序表我们已经实现完毕了&#xff0c;下来我们实现一下动态顺序表 静态链接&#xff1a;数据结构之顺序表——动态顺序表(C语言版) 首先来了解一下两个顺序表的差别 一、内存管理的灵活性 动态分配与释放&#xff1a;动态顺序表能够在运行时根据需要动态地分配和释放内存…

Prometheus+Grafana 监控 Kubernetes

文章目录 一、Prometheus介绍二、Prometheus组件与监控三、Prometheus基本使用&#xff1a;怎么来监控四、Kubernetes监控指标五、Prometheus的基本使用&#xff1a;部署1.基于docker部署prometheusgrafana2. 查看prometheus配置文件3. 监控Linux服务器3.1找到自己相应的系统去…

C# 中循环的应用说明

一循环的概念说明 在C#编程中&#xff0c;循环结构是一种非常重要的控制流语句&#xff0c;它允许我们重复执行一段代码&#xff0c;直到满足某个特定条件为止。C#提供了几种不同类型的循环结构&#xff0c;包括for循环、while循环、do-while循环和foreach循环。 循环语句允许…

【华为HCIP实战课程十一】OSPF网络NBMA网络解决方案,网络工程师

上节我们讲解了DR DBR 选举,每台设备可以学到全网路由,但是通信是有问题的 DR BDR的选举是基于接口的,而不是基于路由器的 一、OSPF路由通信问题 R5虽然可以学到全网的OSPF路由,但是R5无法ping通44.1.1.1 原因是R5到达R4 lo0的下一跳是10.1.1.4, 而R5和R4直连无法ping通…

40款主流的AI工具集盘点,这些好用的AI软件一定要知道!

AI工具哪款好&#xff0c;有哪些值得推荐&#xff1f; 不可否认&#xff0c;当下各式各样的AI工具层出不穷&#xff0c;面对不断涌现的AI工具&#xff0c;各位在选用时是否无从下手&#xff0c;或是抽不出时间&#xff0c;逐一体验对比不同AI工具的差异…… 这也是现如今许多…

根据PFX证书文件合成Nginx所需的SSL证书

具体步骤如下&#xff1a; 1、安装openssl 工具地址&#xff1a;http://slproweb.com/products/Win32OpenSSL.html 并配置环境变量。 2、生成证书 &#xff08;1&#xff09;以管理员身份运行cmd&#xff0c;进入到pfx文件的目录&#xff1a; &#xff08;2&#xff09;根据…

一款零依赖、跨平台的流媒体协议处理工具,支持 RTSP、WebRTC、RTMP 等视频流协议的处理

大家好&#xff0c;今天给大家分享一款功能强大的流媒体协议处理工具go2rtc&#xff0c;支持多种协议和操作系统&#xff0c;具有零依赖、零配置、低延迟等特点。 项目介绍 go2rtc可以从各种来源获取流&#xff0c;包括 RTSP、WebRTC、HomeKit、FFmpeg、RTMP 等&#xff0c;并…

Cherno游戏引擎笔记(73~90)

------- scene viewport ---------- 》》》》做了两件事&#xff1a;设置视口和设置相机比例 》》》》为什么要设置 m_ViewportSize 为 glm::vec2 而不是 ImVec2 ? 因为后面需要进行 ! 运算&#xff0c;而 ImVec2 没有这个运算符的定义&#xff0c;只有 glm::vec2 有这个运算…

atcoder abc375

A seats 代码&#xff1a; #include <bits/stdc.h> using namespace std;int main() {int n;cin >> n;vector<char> a(n 1);for(int i 1; i < n; i ) cin >> a[i];int cnt 0;for(int i 1; i < n - 2; i ) {if(a[i] # && a[i 1…

LeetCode刷题日记之回溯算法(五)

目录 前言重新安排行程N皇后解数独总结 前言 今天是学习回溯算法的第五天&#xff0c;我们继续来一起学习回溯算法蕴含的逻辑处理&#xff0c;希望博主记录的内容能够对大家有所帮助 &#xff0c;一起加油吧朋友们&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa; 重新安…

IDEA中git如何快捷的使用Cherry-Pick功能

前言 我们在使用IDEA开发时&#xff0c;一般是使用GIT来管理我们的代码&#xff0c;有时候&#xff0c;我们需要在我们开发的主分支上合并其他分支的部分提交代码。注意&#xff0c;是部分&#xff0c;不是那个分支的全部提交&#xff0c;这时候&#xff0c;我们就需要使用Che…

重学SpringBoot3-集成Spring Boot Actuator

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Spring Boot Actuator 1. 什么是 Spring Boot Actuator&#xff1f;2. Spring Boot Actuator 的核心功能3. Spring Boot 3 中集成 Actuator3.1 添加…

RBTree(红黑树)的介绍和实现

欢迎来到杀马特的主页&#xff1a;羑悻的小杀马特.-CSDN博客 目录 ​编辑 一红黑树介绍&#xff1a; 1.1红黑树概念&#xff1a; 1.2红黑树遵循的原则&#xff1a; 1.3红黑树效率分析&#xff1a; 二.红黑树的实现&#xff1a; 2.1红黑树结构&#xff1a; 2.2红黑树节点…

PAT甲级-1127 ZigZagging on a Tree

题目 题目大意 给出一棵树的中序和后序遍历&#xff0c;要求按层序输出这棵树&#xff0c;但是按照从左到右&#xff0c;再从右到左&#xff0c;再从左到右的顺序。 思路 由中序遍历和后序遍历可以构造出一棵二叉树。观察题目中要求的输出顺序&#xff0c;发现层数为奇数的都…

第十五章 RabbitMQ延迟消息之延迟插件

目录 一、引言 二、延迟插件安装 2.1. 下载插件 2.2. 安装插件 2.3. 确认插件是否生效 三、核心代码 四、运行效果 五、总结 一、引言 上一章我们讲到通过死信队列组合消息过期时间来实现延迟消息&#xff0c;但相对而言这并不是比较好的方式。它的代码实现相对来说比…

等保制度要求企业保障数据存储安全,天锐绿盾强大加密技术实现文档防泄密

网络安全等级保护&#xff08;等保&#xff09;制度是我国信息安全保障工作的基本制度和基本国策&#xff0c;是开展信息安全工作的基本方法&#xff0c;是促进信息化、维护国家信息安全的基本保障。等保不仅是对网络&#xff08;含信息系统、数据&#xff09;实施分等级保护、…