C12—基于QMediaPlayer制作音乐播放器2022-03-31

2023-10-11 13:40

本文主要是介绍C12—基于QMediaPlayer制作音乐播放器2022-03-31,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt制作音乐播放器

场景

制作一款音乐播放器,能够支持wav、mp3文件的播放,用户可以选择列表中的歌曲进行播放,有三个按钮对应播放/暂停,上一曲,下一曲。源代码下载

步骤

1.搭建界面,准备素材
界面搭建如下:
在这里插入图片描述
布局的时候为了美观可以给弹簧或者部件设置固定值。背景图网上随处可见,音乐素材可以去耳聆网去找,图标可以去阿里巴巴图标矢量库去找。需要注意的是,这个程序中,使用样式表的方法设置背景,那需要重写paintEvent()函数,否则将看不到背景图。重写代码如下:

void Widget::paintEvent(QPaintEvent *e)
{QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

2.加载某一个固定的目录的音乐文件。使用QDir创建目录,配合QStringList创建文件过滤器,将文件名字全部添加到界面空间listWidget中。
3.创建播放器管理对象,即实例化QMediaPlayer,并进行必要的功能配置。
4.写三个按钮的槽函数,实现对应功能。

总结与思考

总结:
1.代码中提供了两种设置窗体背景的方法,使用样式表的方法时,对应的样式表的代码如下:

background-image: url(:/img/background.jpeg);//改为自己的路径即可

2.设置按钮的图标,在我的文章中,之前都是使用setIcon,本次使用设置样式表的方式。
3.使用QDir获取某一路径下文件的方式应该注意和学习,同时使用文件过滤器的方法也应掌握。
4.使用QMediaPlayer播放音乐文件的方法第一次出现,同时要注意使用这个类,应在.pro文件中添加QT += multimedia。
拓展
这个小项目写的比较粗糙,只实现了基础功能,可以再次基础上从实用角度和技术角度完善,包括了:
1.可以使用Vertical Slider或者Dial控件调整音量;
2.QMediaPlayer有关于进度的信号作为接口,实现播放进度条。
3.QMediaPlayer切换不同播放状态(stop,playing,pasue)时会发出信号,可以根据这些信号丰富一下界面。
4.可以在listWidget中加上鼠标点击事件,例如双击播放。
5.可以实现拖拽进入执行播放的功能。
6.使用QLabel显示正在播放的文件名。
7.使用按钮可以刷新”目录中的内容“或者导入某些文件。
8.QMediaPlayer的setMedia方法可以播放网络歌曲,将Url设置为网络地址即可。

代码

main文件

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

.h文件

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QStyleOption>
#include <QPainter>
#include <QDir>
#include <QListWidgetItem>
#include <QMediaPlayer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
protected:void paintEvent(QPaintEvent*);
private slots:void on_lastBtn_clicked();void on_startBtn_clicked();void on_nextBtn_clicked();
private:QString myDir;//获取音乐目录QListWidgetItem *myItem;//音乐列表指针QMediaPlayer *myPlayer;//播放器指针bool isStart;//指示播放状态int listNum;//列表总数int currentIndex;//当前索引
private:Ui::Widget *ui;void Init();void getDir();void setPlayer();
};
#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);Init();
}Widget::~Widget()
{delete myItem;delete ui;
}void Widget::paintEvent(QPaintEvent *e)
{//添加背景图的第一种方法,QSS中添加背景图,在此处重绘才可以显示QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);//添加背景图第二种方法
//        QPainter painter(this);
//        QPixmap pix(":/img/background.jpeg");
//        pix.scaled(this->width(),this->height());
//        painter.drawPixmap(0,0,this->width(),this->height(),pix);}void Widget::Init()
{//初始配置和成员变量初始化this->setWindowTitle("音乐播放器JC");myDir.clear();isStart=false;myItem = new QListWidgetItem();myPlayer=new QMediaPlayer(this);listNum=0;currentIndex=0;getDir();setPlayer();
}void Widget::getDir()
{//1.设置遍历路径myDir = "E:/myCsdn/C12QMusicPlayer/myMusicPlayer/music";QDir dir(myDir);//2.设置文件过滤器QStringList myFileters;myFileters<<"*.wav" << "*.mp3";//3.保存过滤后的文件名QStringList fileList = dir.entryList(myFileters,QDir::Files|QDir::Readable,QDir::Name);//4.添加到listwidget中ui->listWidget->addItems(fileList);ui->listWidget->sortItems();listNum=ui->listWidget->count()-1;myItem = ui->listWidget->item(0);myItem->setSelected(true);
}
//设置播放器当前曲目
void Widget::setPlayer()
{myPlayer->setMedia(QUrl::fromLocalFile(myDir+'/'+ui->listWidget->item(currentIndex)->text()));myPlayer->setVolume(30);//设置音量myPlayer->pause();
}//上一曲 暂停当前曲目,判断边界,播放器指向上一首,准备播放
void Widget::on_lastBtn_clicked()
{if(currentIndex==0){currentIndex=listNum;}else{currentIndex--;}setPlayer();if(!isStart){//当前未播放myItem = ui->listWidget->item(currentIndex);myItem->setSelected(true);}else{//当前正在播放myPlayer->stop();myPlayer->play();myItem = ui->listWidget->item(currentIndex);myItem->setSelected(true);}
}
//播放 暂停:切换图标,并且执行暂停/播放操作
void Widget::on_startBtn_clicked()
{if(isStart){isStart=false;ui->startBtn->setStyleSheet("QPushButton#startBtn{border-image: url(:/img/start.png);background:transparent;}");myPlayer->pause();}else{isStart=true;ui->startBtn->setStyleSheet("QPushButton#startBtn{border-image: url(:/img/stop.png);background:transparent;}");myPlayer->play();}
}
//下一曲:暂停当前曲目,判断边界,播放器指向下一首,准备播放
void Widget::on_nextBtn_clicked()
{if(currentIndex==listNum){currentIndex=0;}else{currentIndex++;}setPlayer();if(!isStart){myItem = ui->listWidget->item(currentIndex);myItem->setSelected(true);//设置选中}else{myPlayer->stop();myPlayer->play();myItem = ui->listWidget->item(currentIndex);myItem->setSelected(true);}
}

这篇关于C12—基于QMediaPlayer制作音乐播放器2022-03-31的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/188428

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中,如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹(即该文件夹内没有任何文件或子文件夹),你可以使用rmdir命令。但是,如果mysql-8.0.31文件夹并非完全为空(即它包含文件或子文件夹),rmdir命令会失败。 如果你的目标是删除mysql-8.0.31文件夹及其内部的所有内容(无论是否为空),你应该使用rm命令结合-r(或-R,它们是等价的)选项来递归地删

Vue day-03

目录 Vue常用特性 一.响应更新 1. 1 v-for更新监测 1.2 v-for就地更新 1.3 什么是虚拟DOM 1.4 diff算法更新虚拟DOM 总结:key值的作用和注意点: 二.过滤器 2.1 vue过滤器-定义使用 2.2 vue过滤器-传参和多过滤器 三. 计算属性(computed) 3.1 计算属性-定义使用 3.2 计算属性-缓存 3.3 计算属

OpenStack离线Train版安装系列—0制作yum源

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack镜像制作系列5—Linux镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作

OpenStack镜像制作系列4—Windows Server2019镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录  CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作系

OpenStack镜像制作系列2—Windows7镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录 CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作系列