#include "haomusic.h"
#include "ui_haomusic.h"
#include <QByteArray>
#include <QButtonGroup>
#include <QFocusEvent>
#include <QListWidgetItem>
#include <QMenu>
#include <QMetaEnum>
#include <QMovie>
#include <QPainter>
#include <QScroller>
#include <QScrollBar>
#include <QThreadPool>
#include <QTimer>
#include "mybottombar.h"
#include "mylineedit.h"
HaoMusic::HaoMusic(QWidget *parent)
: SwitchAnimation(parent)
, ui(new Ui::HaoMusic)
{
ui->setupUi(this);
// 加载样式表
QFile file(":/qss/style.css");
if (file.open(QIODevice::ReadOnly)) {
this->setStyleSheet(QString(file.readAll()));
file.close();
}
// 设置托盘图标
setTrayIcon();
// 初始化播放器
initPlayer();
// 连接信号和槽
connectSignalsAndSlots();
// 初始化音乐列表
initMusicList();
// 读取配置
readSettings();
}
HaoMusic::~HaoMusic()
{
delete ui;
m_db->close();
writeSettings();
}
// 初始化
void HaoMusic::initPlayer()
{
paintShadowRadiusWidget();
// 网络处理类初始化
search = new MyHttp(this);
// 播放器初始化
mediaPlayer = new QMediaPlayer(this);
mediaPlaylist = new MyMediaPlaylist(this);
mediaPlaylist->setPlaybackMode(MyMediaPlaylist::Loop);//设置播放模式(顺序播放,单曲循环,随机播放等)
mediaPlayer->setPlaylist(mediaPlaylist);
mediaPlayer->setAudioRole(QAudio::MusicRole);
mediaPlayer->setVolume(volume);
ui->horizontalSlider_volume->setValue(volume);
// 按钮互斥
QButtonGroup *btnGroup = new QButtonGroup(this);
btnGroup->setExclusive(true);
btnGroup->addButton(ui->pushButton_localmusic);
btnGroup->addButton(ui->pushButton_favorite);
btnGroup->addButton(ui->pushButton_recentlyplayed);
btnGroup->addButton(ui->pushButton_defaultSongList);
btnGroup->addButton(ui->pushButton_search);
connect(btnGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked), this, [=](QAbstractButton *btn) {
QList<QAbstractButton*> buttons = btnGroup->buttons();
foreach (QAbstractButton *button, buttons) {
button->setEnabled(true);
}
btn->setEnabled(false);
ui->pushButton_search->setEnabled(true);
});
// 设置列表属性
ui->listWidget_favorite->init(MyListWidget::FAVORITE, "我喜欢的音乐");
ui->listWidget_localMusic->init(MyListWidget::LOCAL, "本地音乐");
ui->listWidget_searchResult->init(MyListWidget::SEARCHRESULT, "搜索结果");
ui->listWidget_history->init(MyListWidget::HISTORY, "历史播放列表");
// ui->listWidget_defaultList->init(MyListWidget::DEFALUT, "我创建的歌单");
// 初始化歌单列表
// songLists.insert(MyListWidget::FAVORITE, ui->listWidget_favorite);
// songLists.insert(MyListWidget::LOCAL, ui->listWidget_localMusic);
// songLists.insert(MyListWidget::SEARCHRESULT, ui->listWidget_searchResult);
// songLists.insert(MyListWidget::HISTORY, ui->listWidget_history);
// songLists.insert(MyListWidget::DEFALUT, ui->listWidget_defaultList);
// 加载动画
loadingMovie = new QMovie(":/icon/loading.gif", QByteArray(), this);
ui->label_loading->setMovie(loadingMovie);
//设置歌词鼠标左键拖动
QScroller::grabGesture(ui->listWidget_lrc,QScroller::LeftMouseButtonGesture);
ui->listWidget_lrc->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
ui->listWidget_lrc->verticalScrollBar()->setSingleStep(10);
ui->lineEdit_listName->hide();
}
// 初始化音乐列表
void HaoMusic::initMusicList()
{
// 获取数据库实例
m_db = MusicDB::instance();
ui->pushButton_localmusic->click();
if (search->hotSearch().isEmpty())
return;
ui->lineEdit_search->setPlaceholderText(search->hotSearch().first());
}
// 设置托盘图标
void HaoMusic::setTrayIcon()
{
//新建一个托盘图标对象 在QSystemTrayIcon()中添加this指针指向musicplayer,以便在关闭窗口时销毁托盘图标
QSystemTrayIcon *trayicon = new QSystemTrayIcon(this);
// 设置托盘图标
trayicon->setIcon(QIcon(QPixmap(":/icon/MusicPlayer.ico")));
//设置托盘图标提示:鼠标移动到上面会提示文字
trayicon->setToolTip(QString("MusicPlayer"));
connect(trayicon, &QSystemTrayIcon::activated, this, &HaoMusic::iconActived);
//创建菜单项
QMenu *traymenu = new QMenu();
//设置托盘图标右键菜单
trayicon->setContextMenu(traymenu);
// 设置托盘图标菜单
traymenu->addAction("打开主界面",this,&HaoMusic::activateWindow);
traymenu->addAction("退出",this,&HaoMusic::close);
// 显示托盘图标
trayicon->show();
}
// 双击托盘图标显示窗口
void HaoMusic::iconActived(QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
//双击托盘显示窗口
case QSystemTrayIcon::Trigger:
this->setWindowState(Qt::WindowActive);
this->show();
break;
default:
break;
}
}
// 连接信号和槽
void HaoMusic::connectSignalsAndSlots()
{
// 绑定音乐进度条点击事件
connect(ui->horizontalSlider_musicProgress,&CustomSlider::customSliderClicked,this,&HaoMusic::sliderClicked);
// 绑定播放进度改变事件
connect(mediaPlayer,&QMediaPlayer::positionChanged,this,&HaoMusic::onPositionChanged);
// 按Enter键搜索
connect(ui->lineEdit_search, &QLineEdit::returnPressed, [=] {
ui->pushButton_search->click();
ui->lineEdit_search->clearFocus();
});
// 播放状态改变,更新播放按钮和提示
connect(mediaPlayer, &QMediaPlayer::stateChanged, [=]()
{
switch(mediaPlayer->state())
{
case QMediaPlayer::PlayingState:
ui->pushButton_switch->setToolTip("暂停");
ui->pushButton_switch->setIcon(QIcon(QPixmap(":/icon/Player, pause.svg")));
break;
default:
ui->pushButton_switch->setToolTip("播放");
ui->pushButton_switch->setIcon(QIcon(QPixmap(":/icon/Player, play.svg")));
break;
}
});
connect(mediaPlaylist, &MyMediaPlaylist::playbackModeChanged, this, [=](QMediaPlaylist::PlaybackMode mode) {
switch (mode) {
//列表循环
case MyMediaPlaylist::Loop:
ui->pushButton_mode->setIcon(QIcon(QPixmap(":/icon/repeat.svg")));
ui->pushButton_mode->setToolTip("列表循环");
break;
//顺序播放
case MyMediaPlaylist::Sequential:
ui->pushButton_mode->setIcon(QIcon(QPixmap(":/icon/order-play-fill.svg")));
ui->pushButton_mode->setToolTip("顺序播放");
break;
//随机播放
case MyMediaPlaylist::Random:
ui->pushButton_mode->setIcon(QIcon(QPixmap(":/icon/random.svg")));
ui->pushButton_mode->setToolTip("随机播放");
break;
//单曲循环
case MyMediaPlaylist::CurrentItemInLoop:
ui->pushButton_mode->setIcon(QIcon(QPixmap(":/icon/repeat-one-line.svg")));
ui->pushButton_mode->setToolTip("单曲循环");
break;
case MyMediaPlaylist::CurrentItemOnce:
break;
}
});
// 当前媒体状体改变
connect(mediaPlayer, &QMediaPlayer::mediaStatusChanged, [=]()
{
if (QMediaPlayer::EndOfMedia == mediaPlayer->mediaStatus()) {
mediaPlaylist->next();
}
});
// 播放歌曲改变
connect(mediaPlayer, &QMediaPlayer::currentMediaChanged, this, [=] {
int index = mediaP