基于Qt5GUI框架+SQLite的音乐播放器

发布于:2022-12-26 ⋅ 阅读:(372) ⋅ 点赞:(0)

目录
音乐播放器 3
一、概述 3
主要内容: 3
已实现的目标: 3
二、主要类的设计 3
1)依次介绍各个主要类的设计: 3
2)综上所述,各个类之间的关系大致如下图所示: 6
三、程序的功能特点和运行操作方法 6
四、实现中值得一提的地方 12
1)歌曲图片 12
2)歌词展示 12
3)在Qt Designer 中使用自定义的部件 12
4)界面设计总结 12
音乐播放器
一、概述

主要内容:

利用Qt5 GUI 框架及其中的音频播放模块,完成了一个小巧、界面精美的本地音乐播放器。支持添加本地音乐、添加歌单、歌词查看、自定义背景、系统托盘控制播放等。同时, 使用SQLite 本地数据库保存已添加的音乐、歌单的信息,本文转载自http://www.biyezuopin.vip/onews.asp?id=15252且使用.ini 文件记录应用设置信息。

已实现的目标:

界面精美且支持自定义背景
支持播放的音乐格式:.mp3 文件、.flac 文件、.mpga 文件
支持解析并展示歌词文件(.lrc 文件)
支持解析歌曲信息(专辑、比特率、缩略图等等)
支持歌单管理
系统托盘可控制播放
数据库保存已添加的歌曲和歌单信息

二、主要类的设计

1)依次介绍各个主要类的设计:

a) Music 类
代表一首歌曲。记录着歌曲相关信息,其中最为重要的是歌曲的 url 信息(即:歌曲文件所在的路径),播放的时候需要根据 url 来将歌曲文件加入播放器。还记录下的一些其他的歌曲信息,可见于下图。
部分数据成员及成员函数展示:

#include "Music.h"
#include <QMediaPlayer>
#include <QCoreApplication>
#include <QMessageBox>
#include <QtSql>

Music::Music(QUrl iurl)
{
    url=iurl;
    refreshInfo();
}

extern QString formatTime(qint64 timeMilliSeconds);
void Music::refreshInfo()
{
    QMediaPlayer tempPlayer;
    tempPlayer.setMedia(url);
    //元数据的解析需要时间,所以这里需要循环等待(但同时需要保持Qt事件处理机制在运行)
    while(!tempPlayer.isMetaDataAvailable()){
        QCoreApplication::processEvents();
    }
    QStringList list=tempPlayer.availableMetaData();//调试时查看有哪些元数据可用
    if(tempPlayer.isMetaDataAvailable()){
        //歌曲信息
        author = tempPlayer.metaData(QStringLiteral("Author")).toStringList().join(",");
        //author = tempPlayer.metaData(QStringLiteral("Author")).toString(); //查手册发现,这里返回的是StringList
        //author=tempPlayer.metaData(QStringLiteral("ContributingArtist")).toStringList().join(","); //另一种元数据
        title = tempPlayer.metaData(QStringLiteral("Title")).toString();
        albumTitle = tempPlayer.metaData(QStringLiteral("AlbumTitle")).toString();
        audioBitRate = tempPlayer.metaData(QStringLiteral("AudioBitRate")).toInt();
        duration=tempPlayer.duration();
    }
}

QString Music::getLyricFile()
{
    QString mp3FilePath=url.toLocalFile();
    mp3FilePath.replace(".mp3",".lrc");
    mp3FilePath.replace(".flac",".lrc");
    mp3FilePath.replace(".mpga",".lrc");
    return mp3FilePath;
}

QString Music::getInfo() const
{
    return author+" - "+title+" ["+formatTime(duration)+"]";
}

void Music::detail()
{
    QString info("歌曲名:%1\n艺术家:%2\n时长:%3\n唱片集:%4\n比特率:%5\n文件路径:%6");
    info=info.arg(title,author,formatTime(duration),albumTitle,QString::number(audioBitRate)+"bps",url.toString());
    QMessageBox::about(Q_NULLPTR,"歌曲信息",info);
}

void Music::insertSQL(const QString &name)
{
    QSqlQuery sql_query;
    QString insert_sql = "insert into MusicInfo values (?, ?, ?, ?, ?, ?, ?)";
    sql_query.prepare(insert_sql);
    sql_query.addBindValue(name);
    sql_query.addBindValue(url.toString());
    sql_query.addBindValue(author);
    sql_query.addBindValue(title);
    sql_query.addBindValue(duration);
    sql_query.addBindValue(albumTitle);
    sql_query.addBindValue(audioBitRate);
    sql_query.exec();
}

bool MusicCompare::operator()(const Music &A, const Music &B)
{
    switch (key) {
    case TITLE:
        return A.title<B.title;
    case AUTHOR:
        return A.author<B.author;
    case DURATION:
        return A.duration<B.duration;
    case EQUALITY:
        return A.getUrl()==B.getUrl();
    default:
        return A.getInfo()<B.getInfo();
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到