#QT(本地音乐播放器)

1.IDE:QTCreator


2.实验:之前做的音乐播放器只做了一个界面,是因为跟的课程发现到后面需要付费,并且WINGW6.2.0运行QMediaPlayer时无法运行,会崩溃,现在退一步用WINGW5.12.2做一个本地音乐播放器


3.记录:

(1)鼠标悬停,背景颜色改变

(2)listwidget以及水平滑块

(3)双击播放音乐的实现

void Widget::on_listWidget_doubleClicked(const QModelIndex &index)    //双击播放指定音乐
{mediaplayer->setMedia(playlist[index.row()]);mediaplayer->play();
}

(4)打开文件夹的实现

void Widget::on_openfile_pb_clicked()   //打开文件按钮按下
{//QMessageBox::information(this,"文件","打开文件");//打开对话框,让用户选择音乐的存放路径auto path=QFileDialog::getExistingDirectory(this,"选择音乐所在的路径","c:/Users/***/Desktop/music_path");   //打开指定文件夹***涉及个人信息
//    qInfo()<<path;   //打印刚才打开文件夹QDir dir(path);    //auto musiclist=dir.entryList(QStringList()<<"*.mp3"<<"*.wav");  //筛出mp3和wav文件
//  qInfo()<<musiclist;  //打印帅选后的音乐//把筛选出的文件在listwidget显示出来ui->listWidget->addItems(musiclist);//默认选择第一首音乐ui->listWidget->setCurrentRow(0);//把音乐完整路径保存起来for(auto file : musiclist)playlist.append(QUrl::fromLocalFile(path+"/"+file));  //append附加
//    qInfo()<<playlist;   //将附加的音乐列表打印出来
}

 (5)播放的实现

void Widget::on_playorpause_pb_clicked()    //播放或者暂停按下
{if(mediaplayer->state()!=QMediaPlayer::PlayingState)  //不处于播放状态{//得到音乐索引int index=ui->listWidget->currentRow();//设置音乐路径mediaplayer->setMedia(playlist[index]);}//判断当前状态switch(mediaplayer->state()){case QMediaPlayer::StoppedState:mediaplayer->play();break;case QMediaPlayer::PausedState:mediaplayer->play();break;  //停止则播放case QMediaPlayer::PlayingState:mediaplayer->pause();break;  //正在播放则暂停//    default:mediaplayer->play();break;}
}

(6)上一首,下一首的实现

void Widget::on_lastsong_pb_clicked()      //上一首
{int index=ui->listWidget->currentRow();if(index==0)    //如果在第一行ui->listWidget->setCurrentRow(ui->listWidget->count()-1);elseui->listWidget->setCurrentRow(index-1);mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]);mediaplayer->play();
}void Widget::on_next_song_pb_clicked()    //下一首
{int index=ui->listWidget->currentRow();if(index == (ui->listWidget->count()-1))  //如果在最后一首歌ui->listWidget->setCurrentRow(0);elseui->listWidget->setCurrentRow(index+1);mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]);mediaplayer->play();
}

 (7)获取音乐总时长,当前播放进度,改变当前播放进度,改变音量的实现

    //获取当前文件总播放时间connect(mediaplayer,&QMediaPlayer::durationChanged,this,[=](qint64 duration){ui->total_playtime->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60,2,10,QChar('0')));//2为位宽,10为进制,QChar('0')为填充0ui->play_slider->setRange(0,duration);});//根据进度改变当前播放时间connect(mediaplayer,&QMediaPlayer::positionChanged,this,[=](qint64 position){ui->now_playtime->setText(QString("%1:%2").arg(position/1000/60,2,10,QChar('0')).arg(position/1000%60,2,10,QChar('0')));//2为位宽,10为进制,QChar('0')为填充0ui->play_slider->setValue(position);});//拖动滑块,让音乐进度随滑块改变而改变connect(ui->play_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setPosition);//拖动滑块,改变音量connect(ui->volume_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setVolume);

(8)总体运行效果

 

MyMusic 2024-03-08 10-02-19


4.代码

pro

QT       += core gui multimedia widgetsgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetRESOURCES += \resource.qrc

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPaintEvent>
#include <QMediaPlayer>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void paintEvent(QPaintEvent *);
private slots:void on_openfile_pb_clicked();void on_playorpause_pb_clicked();void on_lastsong_pb_clicked();void on_next_song_pb_clicked();void on_listWidget_doubleClicked(const QModelIndex &index);void on_close_pb_clicked();void on_about_pb_clicked();private:Ui::Widget *ui;QMediaPlayer *mediaplayer;QList<QUrl> playlist;     //播放列表
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMessageBox>   //消息提示
#include <QFileDialog>  //操作文件
#include <QDir>         //操作路径
#include <QDebug>
//#include <QString>
#include <QMediaPlayer>
#include <QAudioOutput>  //音乐输出Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setFixedSize(this->geometry().size());       //设置固定大小this->setWindowFlag(Qt::FramelessWindowHint);      //关闭窗口标题//定义一个媒体播放对象mediaplayer = new QMediaPlayer(this);//设置音量mediaplayer->setVolume(50);//获取当前文件总播放时间connect(mediaplayer,&QMediaPlayer::durationChanged,this,[=](qint64 duration){ui->total_playtime->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60,2,10,QChar('0')));//2为位宽,10为进制,QChar('0')为填充0ui->play_slider->setRange(0,duration);});//根据进度改变当前播放时间connect(mediaplayer,&QMediaPlayer::positionChanged,this,[=](qint64 position){ui->now_playtime->setText(QString("%1:%2").arg(position/1000/60,2,10,QChar('0')).arg(position/1000%60,2,10,QChar('0')));//2为位宽,10为进制,QChar('0')为填充0ui->play_slider->setValue(position);});//拖动滑块,让音乐进度随滑块改变而改变connect(ui->play_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setPosition);//拖动滑块,改变音量connect(ui->volume_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setVolume);
}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent*)    //重新定义画布
{QPainter paint(this);paint.drawPixmap(0,0,width(),height(),QPixmap(":image/picture/background.jpg"));
}void Widget::on_openfile_pb_clicked()   //打开文件按钮按下
{//QMessageBox::information(this,"文件","打开文件");//打开对话框,让用户选择音乐的存放路径auto path=QFileDialog::getExistingDirectory(this,"选择音乐所在的路径","c:/Users/***/Desktop/music_path");   //打开指定文件夹
//    qInfo()<<path;   //打印刚才打开文件夹QDir dir(path);    //auto musiclist=dir.entryList(QStringList()<<"*.mp3"<<"*.wav");  //筛出mp3和wav文件
//  qInfo()<<musiclist;  //打印帅选后的音乐//把筛选出的文件在listwidget显示出来ui->listWidget->addItems(musiclist);//默认选择第一首音乐ui->listWidget->setCurrentRow(0);//把音乐完整路径保存起来for(auto file : musiclist)playlist.append(QUrl::fromLocalFile(path+"/"+file));  //append附加
//    qInfo()<<playlist;   //将附加的音乐列表打印出来
}void Widget::on_playorpause_pb_clicked()    //播放或者暂停按下
{if(mediaplayer->state()!=QMediaPlayer::PlayingState)  //不处于播放状态{//得到音乐索引int index=ui->listWidget->currentRow();//设置音乐路径mediaplayer->setMedia(playlist[index]);}//判断当前状态switch(mediaplayer->state()){case QMediaPlayer::StoppedState:mediaplayer->play();break;case QMediaPlayer::PausedState:mediaplayer->play();break;  //停止则播放case QMediaPlayer::PlayingState:mediaplayer->pause();break;  //正在播放则暂停//    default:mediaplayer->play();break;}
}void Widget::on_lastsong_pb_clicked()      //上一首
{int index=ui->listWidget->currentRow();if(index==0)    //如果在第一行ui->listWidget->setCurrentRow(ui->listWidget->count()-1);elseui->listWidget->setCurrentRow(index-1);mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]);mediaplayer->play();
}void Widget::on_next_song_pb_clicked()    //下一首
{int index=ui->listWidget->currentRow();if(index == (ui->listWidget->count()-1))  //如果在最后一首歌ui->listWidget->setCurrentRow(0);elseui->listWidget->setCurrentRow(index+1);mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]);mediaplayer->play();
}void Widget::on_listWidget_doubleClicked(const QModelIndex &index)    //双击播放指定音乐
{mediaplayer->setMedia(playlist[index.row()]);mediaplayer->play();
}void Widget::on_close_pb_clicked()     //离开按钮按下
{close();
}void Widget::on_about_pb_clicked()     //关于按钮按下
{QMessageBox::about(this,"关于","应用:本地音乐播放器\r\n版本:1.0.0.0\r\n制作人:GrassFishStudio\r\n时间:2024年3月7日");
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql8的优化(DBA)

Mysql8的优化 1、Mysql的安装优化1.1 修改配置参数&#xff08;命令行、配件文件&#xff09;1.1.1 命令行修改配置参数1.1.2 参数持久化1.1.3 Mysql多实例启动&#xff0c;以及配置密码文件 1.2 查询表的相关参数&#xff0c;以及表空间管理 2、Mysql高级优化&#xff08;SQL&…

Android中显式Intent和隐式Intent的区别

1、intent的中文名 称是意图&#xff0c;Intent是各个组件之间信息沟通的桥梁&#xff0c; 既能在Activity之间沟通&#xff0c;又能在Activity与Service之间沟通&#xff0c;也能在Activity与Broadcast之间沟通 **intent组成元素的列表说明**2、显式Intent&#xff0c;直接指定…

编译支持国密的抓包工具 WireShark

目录 前言WireShark支持国密的 WireShark小结前言 在上一篇文章支持国密的 Web 服务器中,我们搭建了支持国密的 Web 服务器,但是,我们使用 360 安全浏览器去访问,却出现了错误: 是我们的 Web 服务器没有配置好?在这里插入图片描述还是 360 安全浏览器不支持国密?还是两…

C++面试宝典一部分

今天整理书籍资料时&#xff0c;发现多年前打印的面试资料&#xff0c;拍照分享给大家。

基于网络爬虫的购物平台价格监测系统的设计与实现

通过对网络爬虫的购物平台价格监测系统的业务流程进行梳理可知&#xff0c;网络爬虫的购物平台价格监测系统主要由前台买家模块、后台卖家模块以及管理员模块构成。前台功能包含登录功能、注册功能、系统首页功能、唯品会商品详情浏览、唯品会商品收藏、唯品会商品点赞、唯品会…

【Python】科研代码学习:八 FineTune PretrainedModel (用 trainer,用 script);LLM文本生成

【Python】科研代码学习&#xff1a;八 FineTune PretrainedModel [用 trainer&#xff0c;用 script] LLM文本生成 自己整理的 HF 库的核心关系图用 trainer 来微调一个预训练模型用 script 来做训练任务使用 LLM 做生成任务可能犯的错误&#xff0c;以及解决措施 自己整理的 …

ZYNQ实验--PDM波形生成

一、PDM简介 将信号的振幅变化按比例地变换成脉冲宽度的变化&#xff0c;得到脉冲宽度调制(PDM)。详细的原理理论可以参考该文&#xff1a;文献阅读–Pulse-Width Modulation&#xff0c;本文主要介绍PDM的FPGA实现&#xff0c;PDM的生成方式很多具体形式根据需求会有所不同 二…

【Stable Diffusion】入门:原理简介+应用安装(Windows)+生成步骤

【Stable Diffusion】入门&#xff1a;原理简介应用安装&#xff08;Windows&#xff09;生成步骤 原理简介应用安装 原理简介 稳定扩散生成模型(Stable Diffusion)是一种潜在的文本到图像扩散模型&#xff0c;能够在给定任何文本输入的情况下生成照片般逼真的图像。 应用安…

中国广电的独特优势:与三大运营商相比的亮点

2023年&#xff0c;中国广电正式上市了&#xff0c;发出了第一批号段192的号码&#xff0c;然而值得大家了解的是&#xff1a;在中国的通信市场中&#xff0c;中国移动、中国联通和中国电信长期以来占据主导地位。然而&#xff0c;随着中国广电的加入&#xff0c;市场格局正在发…

了解转义字符

了解转义字符 也许在前面的代码中你看到 \n , \0 很纳闷是啥。其实在字符中有⼀组特殊的字符是转义字符&#xff0c;转义字符顾名思义&#xff1a;转变原来的意思的字符。 比如&#xff1a;我们有字符 n &#xff0c;在字符串中打印的时候自然能打印出这个字符&#xff0c;如下…

鸿蒙操作系统 HarmonyOS 3.2 API 9 Stage模型通过ArkTS接入高德地图

用鸿蒙ArkTS语言开发地图APP应用时&#xff0c;很多地图厂商只接入了鸿蒙Java&#xff0c;ArkTS版本陆续接入中&#xff0c;等一段时间才能面世&#xff0c;当前使用地图只能通过鸿蒙的Web组件&#xff0c;将HTML页面嵌入到鸿蒙APP中。具体方法如下&#xff1a;编写HTML <!…

C++容器适配器stack、queue、priority_queue

文章目录 C容器适配器stack、queue、priority_queue1、stack1.1、stack的介绍1.2、stack的使用1.3、stack的模拟实现 2、queue2.1、queue的介绍2.2、queue的使用2.3、queue的模拟实现 3、priority_queue3.1、priority_queue的介绍3.2、priority_queue的使用3.3、仿函数3.4、pri…

IAR全面支持小华全系芯片,强化工控及汽车MCU生态圈

IAR Embedded Workbench for Arm已全面支持小华半导体系列芯片&#xff0c;加速高端工控MCU和车用MCU应用的安全开发 嵌入式开发软件和服务的全球领导者IAR与小华半导体有限公司&#xff08;以下简称“小华半导体”&#xff09;联合宣布&#xff0c;IAR Embedded Workbench fo…

C语言——递归题

对于递归问题&#xff0c;我们一定要想清楚递归的结束条件&#xff0c;每个递归的结束条件&#xff0c;就是思考这个问题的起始点。 题目1&#xff1a; 思路&#xff1a;当k1时&#xff0c;任何数的1次方都是原数&#xff0c;此时返回n&#xff0c;这就是递归的结束条件&#…

基于FPGA加速的bird-oid object算法实现

导语 今天继续康奈尔大学FPGA 课程ECE 5760的典型案例分享——基于FPGA加速的bird-oid object算法实现。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 ECE 5760 Final Project 模型说明 Bird-oid object …

企业计算机服务器中了mkp勒索病毒如何解密,mkp勒索病毒解密流程

网络技术的应用与发展&#xff0c;为企业的生产运营提高了效率&#xff0c;越来越多的企业利用网络开展多项工作业务&#xff0c;利用网络的优势&#xff0c;可以为企业更好的服务&#xff0c;但是稍不注意就会被网络威胁所盯上。近日&#xff0c;云天数据恢复中心接到多家企业…

CAP告诉你系统没法做到完美,只能做到权衡和适当

一、CAP介绍 CAP原理&#xff0c;全称为Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;和Partition tolerance&#xff08;分区容错性&#xff09;&#xff0c;是分布式系统设计中的基本原理。它强调了在设计分布式系统时&#xff0c…

面试题:分布式锁用了 Redis 的什么数据结构

在使用 Redis 实现分布式锁时&#xff0c;通常使用 Redis 的字符串&#xff08;String&#xff09;。Redis 的字符串是最基本的数据类型&#xff0c;一个键对应一个值&#xff0c;它能够存储任何形式的字符串&#xff0c;包括二进制数据。字符串类型的值最多可以是 512MB。 Re…

二次供水无人值守解决方案

二次供水无人值守解决方案 二次供水系统存在一定的管理难题和技术瓶颈&#xff0c;如设备老化、维护不及时导致的水质安全隐患&#xff0c;以及如何实现高效运行和智能化管理等问题。在一些地区&#xff0c;特别是老旧小区或农村地区&#xff0c;二次供水设施建设和改造滞后&a…

grpc的metadata机制

引言 gRPC让我们可以像本地调用一样实现远程调用&#xff0c;对于每一次的RPC调用中&#xff0c;都可能会有一些有用的数据&#xff0c;而这些数据就可以通过metadata来传递。metadata是以key-value的形式存储数据的&#xff0c;其中key是 string类型&#xff0c;而value是[]s…