尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

不仅可以播放mp3音频文件,也可以播放视频文件(如 .mp4、.avi 等),但应该与QVideoWidget 配合使用以显示视频画面。

不仅可以播放mp3音频文件,也可以播放视频文件(如 .mp4、.avi 等),但应该与QVideoWidget 配合使用以显示视频画面。
📅 发布时间:2026/6/19 16:32:38

要在Qt项目中使用Qt多媒体模块,需要在项目配置文件中添加如下语句:Qt += multimedia,如果在项目中使用视频播放功能,还需要添加,Qt += multimediawidgets来使用QVideoWidget或QGraphicsVideoItem进行视频播放。

Qt多媒体模块包含多个类,下面是需要用到的主要类:

音频

相关的类

音频播放会使用如下两个类:

  • QMediaPlayer类:媒体播放器,主要用于播放歌曲、网络收音机等功能;

  • QMediaPlaylist类:专用于播放媒体内容的列表。

音频小项目

实现一个简易MP3播放器,功能如下:

  • 可以选择本地本地mp3格式文件;

  • 可以对设置播放、停止、暂停播放;

  • 调节音量大小、调整播放进度;

  • 显示播放时长以及总时长;

需要在.pro文件中加入QT       += core gui multimedia

#ifndef WIDGET_H
#define WIDGET_H
#include 
//前向声明
class QMediaPlayer;
class QSlider;
class QLabel;
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
private slots://打开文件void openFile();//设置音量void setVolume(int value);//更新进度条的位置void updatePosition();//更新进度条的范围void updateDuration(qint64 duration);//设置进度条的位置void seekPosition();
private:QMediaPlayer *m_player;//媒体播放器QSlider *m_volumeSlider;//声音滑动条QSlider *m_positionSlider;//进度滑动条QLabel *m_timeLabel;//时间标签
};
#endif // WIDGET_H
#include "widget.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
Widget::Widget(QWidget *parent): QWidget(parent)
{setWindowTitle("MP3音频播放器");resize(400, 300);//初始化播放器m_player = new QMediaPlayer(this);//创建四个按钮分别显示"打开文件"、"播放"、"暂停","停止"QPushButton *openButton = new QPushButton("打开文件");QPushButton *playButton = new QPushButton("播放");QPushButton *pauseButton = new QPushButton("暂停");QPushButton *stopButton = new QPushButton("停止");//声音滑动条m_volumeSlider = new QSlider(Qt::Horizontal);//进度滑动条m_positionSlider = new QSlider(Qt::Horizontal);//时间标签(当前播放时长/总时长)m_timeLabel = new QLabel("00:00/00:00");// 设置音量滑动条范围和初始值m_volumeSlider->setRange(0, 100);m_volumeSlider->setValue(50);//设置播放音量m_player->setVolume(30);//启用播放进度条m_positionSlider->setEnabled(true);//设置播放进度的范围m_positionSlider->setRange(0, 100);// 布局QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(openButton);layout->addWidget(playButton);layout->addWidget(pauseButton);layout->addWidget(stopButton);layout->addWidget(new QLabel("音量:"));layout->addWidget(m_volumeSlider);layout->addWidget(new QLabel("进度:"));layout->addWidget(m_positionSlider);layout->addWidget(m_timeLabel);setLayout(layout);// 连接信号与槽connect(openButton, &QPushButton::clicked, this, &Widget::openFile);connect(playButton, &QPushButton::clicked, m_player, &QMediaPlayer::play);connect(pauseButton, &QPushButton::clicked, m_player, &QMediaPlayer::pause);connect(stopButton, &QPushButton::clicked, m_player, &QMediaPlayer::stop);connect(m_volumeSlider, &QSlider::valueChanged, this, &Widget::setVolume);connect(m_player, &QMediaPlayer::positionChanged, this, &Widget::updatePosition);connect(m_player, &QMediaPlayer::durationChanged, this, &Widget::updateDuration);//连接进度条拖动信号connect(m_positionSlider, &QSlider::sliderReleased, this, &Widget::seekPosition);//定时器用于更新进度条QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &Widget::updatePosition);//每1秒更新一次timer->start(1000);
}
Widget::~Widget()
{
}
void Widget::openFile()
{QString filePath =QFileDialog::getOpenFileName(this, "打开mp3文件","", "MP3文件(*.mp3)");if(!filePath.isEmpty()){m_player->setMedia(QUrl::fromLocalFile(filePath));//打开即播放m_player->play();}
}
void Widget::setVolume(int value)
{m_player->setVolume(value);
}
void Widget::updatePosition()
{// 如果用户正在拖动进度条,则跳过自动更新if(m_positionSlider->isSliderDown())return;if(m_player->duration() > 0){//将播放进度转换为百分比形式,这是乘以100的作用,不然就是小数int position = (m_player->position() * 100)/m_player->duration();m_positionSlider->setValue(position);// 更新时间显示//当前时间,使用position获取QTime currentTime(0, 0);currentTime = currentTime.addMSecs(m_player->position());//总时间,使用duration获取QTime totalTime(0, 0);totalTime = totalTime.addMSecs(m_player->duration());m_timeLabel->setText(currentTime.toString("mm:ss")+ "/" + totalTime.toString("mm:ss"));}
}
void Widget::updateDuration(qint64 duration)
{Q_UNUSED(duration);m_positionSlider->setRange(0, 100);
}
void Widget::seekPosition()
{if(m_player->duration() > 0){//计算目标位置(毫秒)= 进度条百分比 × 总时长/100qint64 targetPos =(m_positionSlider->value() * m_player->duration())/100;//设置播放位置m_player->setPosition(targetPos);}
}

测试结果

视频

相关的类

视频播放会使用如下两个类:

  • QMediaPlayer类:高级视频播放器综合应用;

  • QVideoWidget类:用于媒体对象生成的视频。

QMediaPlayer类介绍

不仅可以播放mp3音频文件,也可以播放视频文件(如 .mp4、.avi 等),但需要与QVideoWidget 配合使用以显示视频画面。

视频小项目

需要在.pro文件中加入QT       += core gui multimedia multimediawidgets

#ifndef WIDGET_H
#define WIDGET_H
#include 
#include 
#include 
class QPushButton;
class QSlider;
class QLabel;
class Widget : public QWidget
{Q_OBJECT
public:explicit Widget(QWidget *parent = nullptr);
private slots://打开文件void openFile();//更新进度条的位置void updatePosition(qint64 position);//更新进度条范围void updateDuration(qint64 duration);//设置进度条的位置void setPosition(int position);
private:QMediaPlayer *m_player;//视频播放器QVideoWidget *m_videoWidget;//视频输出组件QPushButton  *m_openButton;//打开文件按钮QPushButton  *m_playButton;//播放按钮QPushButton  *m_pauseButton;//暂停按钮QPushButton  *m_stopButton;//停止按钮QSlider      *m_positionSlider;//进度条QSlider      *m_volumeSlider;//声音条QLabel       *m_timeLabel;//进度时间标签
};
#endif // WIDGET_H
#include "widget.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
Widget::Widget(QWidget *parent): QWidget(parent)
{setWindowTitle("MP4视频播放器");resize(800, 700);//初始化播放器组件m_player = new QMediaPlayer(this);m_videoWidget = new QVideoWidget(this);//设置视频输出m_player->setVideoOutput(m_videoWidget);// 创建控制按钮m_openButton = new QPushButton("打开文件");m_playButton = new QPushButton("播放");m_pauseButton = new QPushButton("暂停");m_stopButton = new QPushButton("停止");//进度条和音量控制m_positionSlider = new QSlider(Qt::Horizontal);m_volumeSlider = new QSlider(Qt::Horizontal);m_volumeSlider->setRange(0, 100);m_volumeSlider->setValue(50);m_timeLabel = new QLabel("00:00/00:00");//主布局QVBoxLayout *mainLayout = new QVBoxLayout;mainLayout->addWidget(m_videoWidget);//控制按钮布局QGridLayout *gridLayout = new QGridLayout;gridLayout->addWidget(m_openButton, 0, 0, 1, 3);gridLayout->addWidget(m_playButton, 0, 3, 1, 3);gridLayout->addWidget(m_pauseButton, 0, 6, 1, 3);gridLayout->addWidget(m_stopButton, 0, 9, 1, 3);gridLayout->addWidget(new QLabel("音量:"), 0, 12);gridLayout->addWidget(m_volumeSlider, 0, 13, 1, 6);gridLayout->addWidget(new QLabel("进度:"), 1, 0);gridLayout->addWidget(m_positionSlider, 1, 1, 1, 18);gridLayout->addWidget(m_timeLabel, 2, 0, 1, 19);mainLayout->addLayout(gridLayout);m_timeLabel->setFixedHeight(50);m_timeLabel->setAlignment(Qt::AlignCenter); //保持文字居中setLayout(mainLayout);//信号槽连接connect(m_openButton, &QPushButton::clicked, this, &Widget::openFile);connect(m_playButton, &QPushButton::clicked, m_player, &QMediaPlayer::play);connect(m_pauseButton, &QPushButton::clicked, m_player, &QMediaPlayer::pause);connect(m_stopButton, &QPushButton::clicked, m_player, &QMediaPlayer::stop);connect(m_volumeSlider, &QSlider::valueChanged, m_player, &QMediaPlayer::setVolume);connect(m_positionSlider, &QSlider::sliderMoved, this, &Widget::setPosition);connect(m_player, &QMediaPlayer::positionChanged, this, &Widget::updatePosition);connect(m_player, &QMediaPlayer::durationChanged, this, &Widget::updateDuration);
}
// 打开视频文件
void Widget::openFile()
{QString fileName =QFileDialog::getOpenFileName(this, "选择视频文件", QDir::homePath(), "视频文件 (*.mp4 *.avi *.mkv *.mov)");if (!fileName.isEmpty()){m_player->setMedia(QUrl::fromLocalFile(fileName));m_player->play();}
}
//更新播放进度显示
void Widget::updatePosition(qint64 position)
{m_positionSlider->setValue(position);// 更新时间标签QTime currentTime(0, 0, 0);currentTime = currentTime.addMSecs(position);QTime totalTime(0, 0, 0);totalTime = totalTime.addMSecs(m_player->duration());m_timeLabel->setText(currentTime.toString("hh:mm:ss")+ "/" + totalTime.toString("hh:mm:ss"));
}
// 更新总时长
void Widget::updateDuration(qint64 duration)
{m_positionSlider->setRange(0, duration);
}
//手动设置播放位置
void Widget::setPosition(int position)
{m_player->setPosition(position);
}

注意:部分同学使用上述代码后看不到视频播放,这里需要安装解码工具LAV Filters(lav解码器),不然看不到视频的播放功能,软件名avfilters_0.73.1.exe。直接网上搜就行

测试结果

相关新闻

  • 设计模式(C++)详解——命令模式(1) - 指南
  • 2025 年最新推荐摇摆筛厂家榜单:聚焦实力雄厚供货稳定品牌,助力企业精准选购筛分设备方形/圆形/石英砂/砂石/精细摇摆筛厂家推荐
  • 江苏国际陆运物流公司口碑榜:TOP7企业服务能力全景解析

最新新闻

  • 上海汽车音响改装选哪家?上海音乐人生,二十年赛事级连锁标杆门店 - 音乐人生汽车音响
  • 技术解析:从Tri-Plane到3D GAN,如何实现高效且一致的神经渲染
  • 通过Selenium实现网页截图来生成应用封面
  • 2026苏州钻石回收实测|国标4C定级,全城无套路靠谱门店变现指南 - 薛定谔的梨花猫
  • C语言宽字符处理:wmemcmp、wmemcpy、wprintf核心函数详解与实战
  • 多模态大语言模型LISA

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号