智能车载系统#视频播放器
视频播放器详细可参考正点原子QT教程视频播放器的设计本人没有做太大改动更换了退出按钮。图片资料从正点原子的官方网站中下载。一、ui界面部分二、代码实现部分功能1videoplayer.h文件#ifndef VIDEOPLAYER_H #define VIDEOPLAYER_H #include QMainWindow #include QMainWindow #include QMediaPlayer #include QMediaPlaylist #include QVBoxLayout #include QHBoxLayout #include QListWidget #include QSpacerItem #include QVideoWidget #include QDebug /* 媒体信息结构体 */ struct video_MediaObjectInfo { /* 用于保存视频文件名 */ QString fileName; /* 用于保存视频文件路径 */ QString filePath; }; QT_BEGIN_NAMESPACE namespace Ui { class VideoPlayer; } QT_END_NAMESPACE class VideoPlayer : public QMainWindow { Q_OBJECT public: VideoPlayer(QMainWindow *parent nullptr); ~VideoPlayer(); private: Ui::VideoPlayer *ui; /* 媒体播放器用于播放视频 */ QMediaPlayer *videoPlayer; /* 媒体列表 */ QMediaPlaylist *mediaPlaylist; /* 视频显示窗口 */ QVideoWidget *videoWidget; /* 视频列表 */ QListWidget *listWidget; /* 水平布局 */ QHBoxLayout *hBoxLayout[1]; /* 水平容器 */ QWidget *hWidget[1]; /* 垂直容器 */ QWidget *vWidget[1]; /* 垂直界面 */ QVBoxLayout *vBoxLayout[1]; /* 视频布局函数 */ void videoLayout(); /* 主窗体大小重设大小函数重写 */ void resizeEvent(QResizeEvent *event); /* 媒体信息存储 */ QVectorvideo_MediaObjectInfo mediaObjectInfo; /* 扫描本地视频文件 */ void scanVideoFiles(); /* 媒体初始化 */ void mediaPlayerInit(); // 判断qss文件是否存在并进行加载 void loadStyle(); private slots: /* 媒体状态改变 */ void mediaPlayerStateChanged(QMediaPlayer::State); /* 列表单击 */ void listWidgetCliked(QListWidgetItem*); /* 媒体列表项改变 */ void mediaPlaylistCurrentIndexChanged(int); /* 媒体总长度改变 */ void mediaPlayerDurationChanged(qint64); /* 媒体播放位置改变 */ void mediaPlayerPositionChanged(qint64); void on_btn_play_clicked(); void on_btn_next_clicked(); void on_btn_volumedown_clicked(); void on_btn_volumeup_clicked(); void on_btn_screen_clicked(); void on_durationSlider_sliderReleased(); void on_volumeSlider_sliderReleased(); void on_btn_previous_clicked(); void on_btn_exit_clicked(); signals: void video_show_main(); }; #endif // VIDEOPLAYER_H2videoplayer.cpp文件#include videoplayer.h #include ui_videoplayer.h #include QCoreApplication #include QFileInfoList #include QDir VideoPlayer::VideoPlayer(QMainWindow *parent) : QMainWindow(parent) , ui(new Ui::VideoPlayer) { ui-setupUi(this); /* 视频播放器布局初始化 */ videoLayout(); /* 媒体初始化 */ mediaPlayerInit(); /* 扫描本地视频 */ scanVideoFiles(); /* 列表连接信号槽 */ connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(listWidgetCliked(QListWidgetItem*))); /* 媒体连接信号槽 */ connect(videoPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(mediaPlayerStateChanged(QMediaPlayer::State))); connect(mediaPlaylist, SIGNAL(currentIndexChanged(int)), this, SLOT(mediaPlaylistCurrentIndexChanged(int))); connect(videoPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(mediaPlayerDurationChanged(qint64))); connect(videoPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(mediaPlayerPositionChanged(qint64))); // 加载qss文件,设置listWidget的样式表 loadStyle(); } VideoPlayer::~VideoPlayer() { delete ui; } // 页面、列表等设计 void VideoPlayer::videoLayout() { /* 设置位置与大小,这里固定为800, 480 */ // this-setGeometry(0, 0, 800, 480); QPalette pal; pal.setColor(QPalette::WindowText, Qt::white); /* 水平容器 */ hWidget[0] new QWidget(); hWidget[0]-setAutoFillBackground(true); /* 水平布局 */ hBoxLayout[0] new QHBoxLayout(); /* 垂直容器 */ vWidget[0] new QWidget(); vWidget[0]-setAutoFillBackground(true); /* 垂直布局 */ vBoxLayout[0] new QVBoxLayout(); /* 设置 */ vWidget[0]-setObjectName(vWidget_0); // label QFont font; font.setPixelSize(18); ui-label-setFont(font); ui-label_1-setFont(font); pal.setColor(QPalette::WindowText, Qt::white); ui-label-setPalette(pal); ui-label_1-setPalette(pal); // 音量条 ui-volumeSlider-setRange(0, 100); ui-volumeSlider-setValue(50); // 音乐列表 listWidget new QListWidget(); videoWidget new QVideoWidget(); listWidget-setObjectName(listWidget); listWidget-setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff); listWidget-setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff); videoWidget-setStyleSheet(border-image: none; background: transparent; border:none); /* H0布局 */ vWidget[0]-setMinimumSize(300, 480); vWidget[0]-setMaximumWidth(300); videoWidget-setMinimumSize(500, 480); hBoxLayout[0]-addWidget(videoWidget); hBoxLayout[0]-addWidget(vWidget[0]); hWidget[0]-setLayout(hBoxLayout[0]); hBoxLayout[0]-setContentsMargins(0, 0, 0, 0); QMainWindow::setCentralWidget(hWidget[0]); /* V0布局 */ QSpacerItem *vSpacer0 new QSpacerItem(0, 80, QSizePolicy::Minimum, QSizePolicy::Maximum); vBoxLayout[0]-addWidget(listWidget); vBoxLayout[0]-addSpacerItem(vSpacer0); vBoxLayout[0]-setContentsMargins(0, 0, 0, 0); vWidget[0]-setLayout(vBoxLayout[0]); // 设置样式表 vWidget[0]-setStyleSheet(border-image:none;); hWidget[0]-setStyleSheet(border-image:none; border-image:url(:/images/bg.png)); /* V1布局 */ /* 底板部件布局 */ ui-vBoxLayout_1-setAlignment(Qt::AlignCenter); ui-vWidget_1-setLayout(ui-vBoxLayout_1); ui-vWidget_1-setParent(this); // 用来切换父窗口 ui-vWidget_1-setGeometry(0, this-height() - 80, this-width(), 80); ui-vBoxLayout_1-setContentsMargins(0, 0, 0, 0); ui-vBoxLayout_1-setAlignment(Qt::AlignCenter); /* 位于最上层 */ ui-vWidget_1-raise(); /* H1布局 */ ui-hBoxLayout_1-setContentsMargins(0, 0, 0, 0); ui-hWidget_1-setLayout(ui-hBoxLayout_1); /* H2布局 */ ui-hBoxLayout_2-setContentsMargins(0, 0, 0, 0); ui-hBoxLayout_2-setAlignment(Qt::AlignLeft | Qt::AlignTop); } // 初始化 void VideoPlayer::mediaPlayerInit() { videoPlayer new QMediaPlayer(this); mediaPlaylist new QMediaPlaylist(this); /* 确保列表是空的 */ mediaPlaylist-clear(); /* 设置视频播放器的列表为mediaPlaylist */ videoPlayer-setPlaylist(mediaPlaylist); /* 设置视频输出窗口 */ videoPlayer-setVideoOutput(videoWidget); /* 设置播放模式Loop是列循环 */ mediaPlaylist-setPlaybackMode(QMediaPlaylist::Loop); /* 设置默认软件音量为50% */ videoPlayer-setVolume(50); } void VideoPlayer::resizeEvent(QResizeEvent *event) { Q_UNUSED(event); ui-vWidget_1-setGeometry(0, this-height() - 80, this-width(), 80); } // 播放按钮设计 void VideoPlayer::mediaPlayerStateChanged( QMediaPlayer::State state) { switch (state) { case QMediaPlayer::StoppedState: ui-btn_play-setChecked(false); break; case QMediaPlayer::PlayingState: ui-btn_play-setChecked(true); break; case QMediaPlayer::PausedState: ui-btn_play-setChecked(false); break; } } // 播放列表设计点击某一项后对象项的颜色背景会变化 void VideoPlayer::listWidgetCliked(QListWidgetItem *item) { videoPlayer-stop(); mediaPlaylist-setCurrentIndex(listWidget-row(item)); videoPlayer-play(); } void VideoPlayer::mediaPlaylistCurrentIndexChanged( int index) { if (-1 index) return; /* 设置列表正在播放的项 */ listWidget-setCurrentRow(index); } // 视频总时长显示 void VideoPlayer::mediaPlayerDurationChanged( qint64 duration) { ui-durationSlider-setRange(0, duration / 1000); int second duration / 1000; int minute second / 60; second % 60; QString mediaDuration; mediaDuration.clear(); if (minute 10) mediaDuration QString::number(minute, 10); else mediaDuration 0 QString::number(minute, 10); if (second 10) mediaDuration mediaDuration : QString::number(second, 10); else mediaDuration mediaDuration :0 QString::number(second, 10); /* 显示媒体总长度时间 */ ui-label_1-setText(/ mediaDuration); } // 播放时间的进度条设计 void VideoPlayer::mediaPlayerPositionChanged( qint64 position) { if (!ui-durationSlider-isSliderDown()) ui-durationSlider-setValue(position / 1000); int second position / 1000; int minute second / 60; second % 60; QString mediaPosition; mediaPosition.clear(); if (minute 10) mediaPosition QString::number(minute, 10); else mediaPosition 0 QString::number(minute, 10); if (second 10) mediaPosition mediaPosition : QString::number(second, 10); else mediaPosition mediaPosition :0 QString::number(second, 10); /* 显示现在播放的时间 */ ui-label-setText(mediaPosition); } // 音频文件过滤 void VideoPlayer::scanVideoFiles() { QDir dir(QCoreApplication::applicationDirPath() /myVideo); QDir dirbsolutePath(dir.absolutePath()); /* 如果目录存在 */ if (dirbsolutePath.exists()) { /* 定义过滤器 */ QStringList filter; /* 包含所有xx后缀的文件 */ filter *.mp4 *.mkv *.wmv *.avi; /* 获取该目录下的所有文件 */ QFileInfoList files dirbsolutePath.entryInfoList(filter, QDir::Files); /* 遍历 */ for (int i 0; i files.count(); i) { video_MediaObjectInfo info; /* 使用utf-8编码 */ info.fileName QString::fromUtf8(files.at(i) .fileName() .toUtf8() .data()); info.filePath QString::fromUtf8(files.at(i) .filePath() .toUtf8() .data()); /* 媒体列表添加视频 */ if (mediaPlaylist-addMedia(QUrl::fromLocalFile(info.filePath))) { /* 添加到容器数组里储存 */ mediaObjectInfo.append(info); /* 添加视频名字至列表 */ listWidget-addItem(info.fileName); } else { qDebug() mediaPlaylist-errorString() .toUtf8().data() endl; qDebug() Error number: mediaPlaylist-error() endl; } } } } // 播放按钮 void VideoPlayer::on_btn_play_clicked() { int state videoPlayer-state(); switch (state) { case QMediaPlayer::StoppedState: /* 媒体播放 */ videoPlayer-play(); break; case QMediaPlayer::PlayingState: /* 媒体暂停 */ videoPlayer-pause(); break; case QMediaPlayer::PausedState: /* 设置视频输出窗口 */ videoPlayer-play(); break; } } void VideoPlayer::on_btn_next_clicked() { videoPlayer-stop(); int count mediaPlaylist-mediaCount(); if (0 count) return; /* 列表下一个 */ mediaPlaylist-next(); videoPlayer-play(); } void VideoPlayer::on_btn_volumedown_clicked() { /* 点击每次音量-5 */ ui-volumeSlider-setValue(ui-volumeSlider-value() - 5); videoPlayer-setVolume(ui-volumeSlider-value()); } void VideoPlayer::on_btn_volumeup_clicked() { /* 点击每次音量5 */ ui-volumeSlider-setValue(ui-volumeSlider-value() 5); videoPlayer-setVolume(ui-volumeSlider-value()); } void VideoPlayer::on_btn_screen_clicked() { /* 全屏/非全屏操作 */ vWidget[0]-setVisible(!ui-btn_screen-isChecked()); } void VideoPlayer::on_durationSlider_sliderReleased() { /* 设置媒体播放的位置 */ videoPlayer-setPosition(ui-durationSlider-value() * 1000); } void VideoPlayer::on_volumeSlider_sliderReleased() { /* 设置音量 */ videoPlayer-setVolume(ui-volumeSlider-value()); } void VideoPlayer::on_btn_previous_clicked() { videoPlayer-stop(); int count mediaPlaylist-mediaCount(); if (0 count) return; /* 列表上一个 */ mediaPlaylist-previous(); videoPlayer-play(); } void VideoPlayer::loadStyle() { /* 指定文件 */ QFile file(:/style_3.qss); /* 判断文件是否存在 */ if (file.exists() ) { /* 以只读的方式打开 */ file.open(QFile::ReadOnly); /* 以字符串的方式保存读出的结果 */ QString styleSheet QLatin1String(file.readAll()); /* 设置全局样式 */ this-setStyleSheet(styleSheet); /* 关闭文件 */ file.close(); } } // 视频播放器退出设计跳转到主界面 void VideoPlayer::on_btn_exit_clicked() { this-hide(); videoPlayer-stop(); emit video_show_main(); }三、最终界面

相关新闻

计算机视觉入门实战:AI-For-Beginners 课程第 6 课 OpenCV 图像处理与运动检测指南

计算机视觉入门实战:AI-For-Beginners 课程第 6 课 OpenCV 图像处理与运动检测指南

教程人工智能机器学习深度学习 【免费下载链接】AI-For-Beginners 12 Weeks, 24 Lessons, AI for All! 项目地址: https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners 点击查看 免费下载 计算机视觉是让计算机"看懂"数字图像的技术分支&#xff0…

2026/10/4 9:00:04 阅读更多 →
都市供求信息网Java Web源码实战:从环境搭建到二次开发

都市供求信息网Java Web源码实战:从环境搭建到二次开发

简介:这份Java项目源码面向Java Web初学者与课程设计开发者,提供一套都市供求信息网的完整实现方案,可用于毕业设计参考、SSM/原生Servlet阶段练手或二次开发。项目采用前后台分离设计:前台覆盖信息列表与详情展示、分类浏览、定位…

2026/10/4 9:00:04 阅读更多 →
基于Java的记账系统毕业设计:从环境部署到核心代码实现全解析

基于Java的记账系统毕业设计:从环境部署到核心代码实现全解析

简介:这是一套基于Java技术栈开发的记账系统毕业设计完整资源包,面向Java初学者、高校应届生及希望完整走通Web应用开发流程的读者。项目以MVC设计模式为核心,覆盖Java SE/EE编程、Spring MVC框架、MyBatis或Hibernate持久层、MySQL数据库操作…

2026/10/4 9:00:04 阅读更多 →

最新新闻

Claude 安装及部署指南:用 TaoToken 统一 Key 打通本地与云端调用

Claude 安装及部署指南:用 TaoToken 统一 Key 打通本地与云端调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:29:25 阅读更多 →
上拉电阻与下拉电阻:原理、选型计算与电路实战指南

上拉电阻与下拉电阻:原理、选型计算与电路实战指南

上拉电阻和下拉电阻这四个字,估计每个写过单片机程序的人都眼熟,但真正能把它们讲透的人并不多。我最早画板子的时候,也有一段“复制粘贴”式的状态:看到I2C总线上挂4.7k我就挂4.7k,看到按键接10k上拉我就接10k&#x…

2026/10/4 9:29:25 阅读更多 →
AS5600在STM32中的高可靠I²C驱动与工程落地实践

AS5600在STM32中的高可靠I²C驱动与工程落地实践

1. 为什么AS5600在STM32项目里越来越难被绕开——从“能用”到“必须用”的真实拐点你有没有遇到过这样的场景:调试一个电机闭环控制,用光电编码器,光栅盘一沾灰就丢脉冲;换霍尔传感器,分辨率卡在12位,调速…

2026/10/4 9:29:25 阅读更多 →
西门子S7-200与显控触摸屏在RO反渗透纯水处理系统中的应用

西门子S7-200与显控触摸屏在RO反渗透纯水处理系统中的应用

1. 系统硬件选型与整体架构1.1 为什么中小型RO设备绕不开西门子224XP先交代一下背景。我刚交付的一套RO反渗透纯水处理控制柜,用的就是西门子S7-200 224XP加显控触摸屏这个组合。很多做水处理设备的同行一看这套配置就明白了——这是中小型纯水项目里性价比非常高的…

2026/10/4 9:29:25 阅读更多 →
云卓安防系统协议克隆:实现DIY设备原生接入NVR

云卓安防系统协议克隆:实现DIY设备原生接入NVR

1. 项目概述:为什么“云卓遥控器DIY高清摄像机”不是拼凑,而是系统级重构 “云卓遥控器DIY高清摄像机的方案(完美接入原系统)”——这个标题里没有一个词是虚的。我做安防类嵌入式系统集成整整13年,经手过27个品牌、8…

2026/10/4 9:29:25 阅读更多 →
TouchDesigner三维渲染实战:从节点化流程到实时交互视觉

TouchDesigner三维渲染实战:从节点化流程到实时交互视觉

1. TouchDesigner三维渲染到底能做什么这年头聊实时视觉、交互装置、舞台演出背景,绕不开TouchDesigner。而三维渲染这块,只要你搞过一两个项目,就会意识到它才是整套视觉系统的真正心脏。很多人一上来就套一堆现成3D素材丢进Blender或C4D渲染…

2026/10/4 9:28:24 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →