QT多媒体

您所在的位置:网站首页 an怎么添加音乐 QT多媒体

QT多媒体

2023-07-10 23:15| 来源: 网络整理| 查看: 265

QT多媒体—简单音乐播放器的实现

​ 要在C++项目中使用Qt多媒体模块,需要在项目配置文件(.pro)中添加如下一行语句

Qt += multimedia 音乐播放器程序的实现

​ QMediaPlayer可以播放经过压缩的音频或视频文件,如mp3、mp4、wmv等文件。QMediaPlayer可以播放单个文件,也可以和QMediaPlaylist类结合,对一个播放列表进行播放。所以使用QMediaPlayer和QMediaPlaylist可以轻松地设计一个自己的音乐或视频播放器。QMediaPlayer的主要接口函数如图所示:

在这里插入图片描述

​ 当使用QMediaPlayer播放媒体文件时,有几个有用的信号可以反映播放状态或文件信息。

1、stateChanged(QMediaPlayer::State state)信号在调用play()、pause()和stop()函数发射,反映播放当前的状态。枚举类型QMediaPlayer::State有3种取值,表示播放器的状态: 1)、QMediaPlayer::StoppedState 停止状态 2)、QMediaPlayer::PlayingState 正在播放状态 3)、QMediaPlayer::PausedState 暂停播放状态 2、durationChanged(qint64 duration)信号在文件的时间长度变化时发射,一般在切换播放文件时发射 3、positionChanged(qint64 position)当前文件播放单个文件,可以反映文件播放进度 音乐播放器的功能

​ QMediaPlayer可以通过setMedia()函数设置播放单个文件,也可以通过setPlaylist()函数设置一个QMediaPlaylist类实例表示的播放列表,对列表文件进行播放,并且自动播放下一个文件,或循环播放等。QMediaPlayer播放的文件可以是本地文件,也可以是网络上的文件。

​ QMediaPlaylist记录播放媒体文件信息,可以添加、移除文件,也可以设置循环播放形式,在列表文件中自动切换文件,在当前播放文件切换时会发射currentIndexChanged()信号和currentMediaChanged()信号。

程序运行截图如下

在这里插入图片描述

程序代码

mainwindow.h的实现

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT private: QMediaPlayer *player;//播放器 QMediaPlaylist *playlist;//播放列表 QString durationTime;//总长度 QString positionTime;//当前播放到位置 public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: //自定义槽函数 //播放器播放状态发生变化时,更新界面上的“播放”、“暂停”、“停止”按钮使能 void onStateChanged(QMediaPlayer::State state); //播放列表的当前文件变化时,更新界面上的媒体文件名 void onPlaylistChanged(int position); //文件时长发生变化时,更新界面上的文件时间长度 void onDurationChanged(qint64 duration); //文件播放位置发生变化时,更新界面上的播放进度 void onPositionChanged(qint64 position); void on_btnAdd_clicked(); void on_btnPlay_clicked(); void on_btnPause_clicked(); void on_btnStop_clicked(); void on_listWidget_doubleClicked(const QModelIndex &index); void on_btnClear_clicked(); void on_sliderVolumn_valueChanged(int value); void on_btnSound_clicked(); void on_sliderPosition_valueChanged(int value); void on_btnRemove_clicked(); void on_btnPrevious_clicked(); void on_btnNext_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H

mainwindow.cpp的实现

#include "mainwindow.h" #include "ui_mainwindow.h" #include // 若MSVC 编译版本错误,修改 msvc-version.conf 文件 // 解决MSVC编译时,界面汉字乱码的问题 #if _MSC_VER >= 1600 //MSVC2015>1899, MSVC_VER= 14.0 #pragma execution_character_set("utf-8") #endif MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); player = new QMediaPlayer(this);// playlist = new QMediaPlaylist(this);// playlist->setPlaybackMode(QMediaPlaylist::Loop); //循环模式 player->setPlaylist(playlist); connect(player,SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(onStateChanged(QMediaPlayer::State))); connect(player,SIGNAL(positionChanged(qint64)), this, SLOT(onPositionChanged(qint64))); connect(player,SIGNAL(durationChanged(qint64)), this, SLOT(onDurationChanged(qint64))); connect(playlist,SIGNAL(currentIndexChanged(int)), this, SLOT(onPlaylistChanged(int))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::onStateChanged(QMediaPlayer::State state) {//播放器状态变化,更新按钮状态 ui->btnPlay->setEnabled(!(state==QMediaPlayer::PlayingState)); ui->btnPause->setEnabled(state==QMediaPlayer::PlayingState); ui->btnStop->setEnabled(state==QMediaPlayer::PlayingState); } void MainWindow::onPlaylistChanged(int position) {//播放列表变化,更新当前播放文件名显示 ui->listWidget->setCurrentRow(position); QListWidgetItem *item=ui->listWidget->currentItem(); if (item) ui->LabCurMedia->setText(item->text()); } void MainWindow::onDurationChanged(qint64 duration) {//文件时长变化,更新进度显示 ui->sliderPosition->setMaximum(duration); int secs=duration/1000;//秒 int mins=secs/60; //分钟 secs=secs % 60;//余数秒 durationTime=QString::asprintf("%d:%d",mins,secs); ui->LabRatio->setText(positionTime+"/"+durationTime); } void MainWindow::onPositionChanged(qint64 position) {//当前文件播放位置变化,更新进度显示 if (ui->sliderPosition->isSliderDown()) return; ui->sliderPosition->setSliderPosition(position);// int secs=position/1000;//秒 int mins=secs/60; //分钟 secs=secs % 60;//余数秒 positionTime=QString::asprintf("%d:%d",mins,secs); ui->LabRatio->setText(positionTime+"/"+durationTime); } void MainWindow::on_btnAdd_clicked() {//添加文件 QString curPath=QDir::homePath();//获取系统当前目录 QString dlgTitle="选择音频文件"; //对话框标题 QString filter="音频文件(*.mp3 *.wav *.wma);;mp3文件(*.mp3);;wav文件(*.wav);;wma文件(*.wma);;所有文件(*.*)"; //文件过滤器 QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter); if (fileList.count()listWidget->addItem(fileInfo.fileName());//添加到界面文件列表 } if (player->state()!=QMediaPlayer::PlayingState) playlist->setCurrentIndex(0); player->play(); } void MainWindow::on_btnPlay_clicked() {//播放 if (playlist->currentIndex()setCurrentIndex(0); player->play(); } void MainWindow::on_btnPause_clicked() {//暂停播放 player->pause(); } void MainWindow::on_btnStop_clicked() {//停止播放 player->stop(); } void MainWindow::on_listWidget_doubleClicked(const QModelIndex &index) {//双击时切换播放文件 int rowNo=index.row(); playlist->setCurrentIndex(rowNo); player->play(); } void MainWindow::on_btnClear_clicked() {//清空列表 playlist->clear(); ui->listWidget->clear(); player->stop(); } void MainWindow::on_sliderVolumn_valueChanged(int value) {//调整音量 player->setVolume(value); } void MainWindow::on_btnSound_clicked() {//静音控制 bool mute=player->isMuted(); player->setMuted(!mute); if (mute) ui->btnSound->setIcon(QIcon(":/images/images/volumn.bmp")); else ui->btnSound->setIcon(QIcon(":/images/images/mute.bmp")); } void MainWindow::on_sliderPosition_valueChanged(int value) {//文件进度调控 player->setPosition(value); } void MainWindow::on_btnRemove_clicked() {//移除一个文件 int pos=ui->listWidget->currentRow(); QListWidgetItem *item=ui->listWidget->takeItem(pos); delete item;//从listWidget里删除 if (playlist->currentIndex()==pos) //是当前播放的曲目 { int nextPos=0; if (pos>=1) nextPos=pos-1; playlist->removeMedia(pos);//从播放列表里移除 if (ui->listWidget->count()>0) { playlist->setCurrentIndex(nextPos); onPlaylistChanged(nextPos); } else { player->stop(); ui->LabCurMedia->setText("无曲目"); } } else playlist->removeMedia(pos); } void MainWindow::on_btnPrevious_clicked() {//前一文件 playlist->previous(); } void MainWindow::on_btnNext_clicked() {//下一文件 playlist->next(); } 对QMidaPlaylist主要函数的补充 addMedia()函数 添加一个文件 removeMedia()函数 移除一个文件 setCurrentIndex()函数 设置当前播放文件序号 clear()函数 清空播放列表


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3