Qt5开发视频播放器

一、播放器界面UI设计

控件对象名 位置(坐标点) 对象名称 组件名称 备注
Widget (0, 0, 809, 572) Widget QWidget
label label QLabel 播放窗口
label_2 label_2 QLabel
voice_control voice_control QSlider 音量滑动条
btn_open btn_open QPushButton 打开文件按钮
label_4 label_4 QLabel
label_ct label_ct QLabel
progress_report progress_report MySlider 当前播放进度标签
label_all_time label_all_time QLabel 视频时长标签
btn_ht btn_ht QPushButton 后退按钮
btn_qj btn_qj QPushButton 前进按钮
btn_start btn_start QPushButton 播放按钮 / 暂停按钮
btn_fullshow btn_fullshow QPushButton 全屏播放按钮
label_5 label_5 QLabel 显示播放列表文本
listWidget listWidget QListWidget 播放列表

效果图如下

二、播放器基本实现

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMediaPlayer>  //播放器
#include <QVideoWidget>  //播放窗口
#include <QMediaPlaylist>//播放列表
#include <QString>
#include <QFileDialog>//文件窗口
#include <QDebug>
#include <QResizeEvent>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QListWidgetItem>
#include <QObject>
#include <QAbstractEventDispatcher>

#include "globalkeyfilter.h"


namespace Ui
{
class Widget;
}

class QMediaPlayer;
class QMediaPlaylist;
class QVideoWidget;

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget* parent = 0);
    void setget_Alltime(qint64 playtime);//获取视频时长并设置到标签
    void setget_currenttime(qint64 playtime);//获取当时播放位置并设置
    void settimeslider(qint64 playtime);//设置进度条
    void exitFullScreen();  // 退出全屏
    void togglePlayback();  // 暂停/播放

    ~Widget();

private slots:
    void on_btn_open_clicked();//打开音视频

    void on_btn_start_clicked();//播放

    void on_voice_control_valueChanged(int value);//控制声音

    void on_btn_fullshow_clicked();//全屏显示

    void getduration(qint64 playtime);   //获取时间改变信号

    void getposition(qint64 playtime);   //获取当前播放位置

    void on_btn_ht_clicked();//上一个音视频

    void on_btn_qj_clicked();//下一个音视频

    void on_listWidget_doubleClicked(const QModelIndex& index);



private:
    Ui::Widget* ui;
    QStringList         m_strlist;          //文件名列表
    QMediaPlayer*       m_pMediaPlayer;     //播放器
    QVideoWidget*       m_pVideoWidget;     //播放窗口
    QMediaPlaylist*     m_MediaPlaylist;    //播放列表
    QMediaPlayer::State m_state;            //播放状态
    int m_hour;                             //视频总时长
    int m_munete;                           //分钟
    int m_second;                           //秒
    bool m_sliderstate;                     //滑块是否被选中的状态
    int m_slider_crtval;                    //滑块当前值

    GlobalKeyFilter* m_globalKeyFilter;     //  GlobalKeyFilter 类
};

#endif // WIDGET_H

将label组件传入QVideoWidget作为实例化参数,即可获得播放窗口,并通过QMediaPlayer调用setVideoOutput函数,指定为播放器窗口。

三、自定义滑块控件

cpp 复制代码
#ifndef MYSLIDER_H
#define MYSLIDER_H

#include <QMouseEvent>
#include <QSlider>

class MySlider : public QSlider
{
    Q_OBJECT
public:
    explicit MySlider(QWidget* parent = nullptr);
protected:
    void mousePressEvent(QMouseEvent* ev);
    void mouseReleaseEvent(QMouseEvent* ev);
signals:
    void mousepress(int value);
    void mouserelease(int value);

};

#endif // MYSLIDER_H

由于进度条数值和视频时长的单位不统一,需要自定义控件MySlider,监听键盘事件,发送计算得到的视频时长数据到Widget类的匿名槽函数中,完成滑动条功能。

四、全局键盘监听事件

创建一个GlobalKeyFilter类,对widget类向前声明,实现全局的键盘监听。

cpp 复制代码
#include "globalkeyfilter.h"
#include "widget.h"
#include <QKeyEvent>
#include <Windows.h>

GlobalKeyFilter::GlobalKeyFilter(Widget* widget) : m_widget(widget)
{
    qDebug() << "键盘监听事件启动了" << "\n";
}

bool GlobalKeyFilter::nativeEventFilter(const QByteArray& eventType, void* message, long* result)
{
    if (eventType == "windows_generic_MSG")
    {
        MSG* msg = static_cast<MSG*>(message);
        if (msg->message == WM_KEYDOWN)
        {
            int key = msg->wParam;

            // 处理 ESC 键
            if (key == VK_ESCAPE)
            {
                if (m_widget)
                {
                    m_widget->exitFullScreen();
                }
            }

            // 处理空格键
            if (key == VK_SPACE)
            {
                m_widget->togglePlayback();
            }
        }
    }

    // 返回 false 以便继续传递事件
    return false;
}
相关推荐
Zer0_on1 小时前
C++string类
开发语言·c++
Tomorrow'sThinker1 小时前
25年1月更新。Windows 上搭建 Python 开发环境:Python + PyCharm 安装全攻略(文中有安装包不用官网下载)
开发语言·python·pycharm
禁默1 小时前
深入浅出:Java 抽象类与接口
java·开发语言
白宇横流学长2 小时前
基于Java的银行排号系统的设计与实现【源码+文档+部署讲解】
java·开发语言·数据库
勉灬之2 小时前
封装上传组件,提供各种校验、显示预览、排序等功能
开发语言·前端·javascript
西猫雷婶4 小时前
python学opencv|读取图像(二十三)使用cv2.putText()绘制文字
开发语言·python·opencv
我要学编程(ಥ_ಥ)5 小时前
速通前端篇——JavaScript
开发语言·前端·javascript
HEU_firejef6 小时前
设计模式——工厂模式
java·开发语言·设计模式
云计算DevOps-韩老师6 小时前
【网络云SRE运维开发】2024第52周-每日【2024/12/31】小测-计算机网络参考模型和通信协议的理论和实操考题
开发语言·网络·计算机网络·云计算·运维开发
fajianchen6 小时前
应用架构模式
java·开发语言