您的位置:首页 > 编程语言 > Qt开发

基于QT的音乐播放器

2016-05-17 00:32 567 查看

---------》


唔。。。没有做任何样式,这只是练习状态机的一个副产品,当然必有BUG,

void MoveWidget::createStateMachine()
{
m_Machine = new QStateMachine;
QState *Left = new QState(m_Machine);
QState *Right = new QState(m_Machine);

Left->assignProperty(this,"geometry",QRect(0,0,700,600));
Right->assignProperty(this,"geometry",QRect(-350,0,700,600));

QSignalTransition *TransitionLeft = Left->addTransition(m_MoveList,&QAbstractButton::clicked,Right);
TransitionLeft->addAnimation(new QPropertyAnimation(this,"geometry"));

QSignalTransition *TransitionRight = Right->addTransition(m_MovePlay,&QAbstractButton::clicked,Left);
TransitionRight->addAnimation(new QPropertyAnimation(this,"geometry"));

m_Machine->setInitialState(Right);
m_Machine->start();
}唔,一个简单的状态机,就是在左右移动而已

void LyricWidget::createStateMachine()
{
Machine = new QStateMachine;
QState *Start = new QState(Machine);
Start->setChildMode(QState::ParallelStates);
for(int i=0;i<2;i++)
States << QList<QState*>();

//m_ListModes
QState *ListMode = new QState(Start);
const int &MidesCount = m_ListModes.count();
for(int i=0;i<MidesCount;i++){
States[Mode] << new QState(ListMode);
States[Mode][i]->assignProperty(m_ListModes[i],"visible",true);
}
for(int i=0;i<MidesCount;i++){
int Index = (i+1)%MidesCount;
States[Mode][i]->addTransition(m_ListModes[i],&QPushButton::clicked,States[Mode][Index]);
connect(States[Mode][i],&QState::entered,m_ListModes[!i?MidesCount-1:i-1],&QPushButton::hide);
connect(States[Mode][i],&QState::entered,this,[=](){
emit playModeChanged(i);
});
}

//m_PlayStates stop[0] play[1] pause[2]
QState *PlayState = new QState(Start);
const int &StateCount = m_PlayStates.count();
foreach (QPushButton *button, m_PlayStates) {
States[State] << new QState(PlayState);
}
for(int i=0;i<StateCount;i++){
States[State][i]->assignProperty(m_PlayStates[0],"enabled",i==2?true:false);
States[State][i]->assignProperty(m_PlayStates[1],"visible",i==2?false:true);
States[State][i]->assignProperty(m_PlayStates[2],"visible",i==2?true:false);
}

States[State][0]->addTransition(m_PlayStates[1],&QPushButton::clicked,States[State][2]);
States[State][1]->addTransition(m_PlayStates[1],&QPushButton::clicked,States[State][2]);
States[State][2]->addTransition(m_PlayStat
4000
es[2],&QPushButton::clicked,States[State][1]);
States[State][1]->addTransition(m_PlayStates[0],&QPushButton::clicked,States[State][0]);
States[State][2]->addTransition(m_PlayStates[0],&QPushButton::clicked,States[State][0]);

//close window
QFinalState *End = new QFinalState(Machine);
Start->addTransition(m_CloseButton,&QToolButton::clicked,End);
connect(End,&QFinalState::entered,QApplication::instance(), &QCoreApplication::quit);

Machine->setInitialState(Start);
Start->setInitialState(ListMode);
ListMode->setInitialState(States[Mode][2]);
PlayState->setInitialState(States[State][1]);
}说说状态机:
首先要有个起始状态,就是说每一个父状态机都需要设置setInitialState,不然会出现丢失状态导致状态机失效

然后需要设置一下当转换到该状态后的设置,assignProperty,可以理解为当进入States[State][i]状态时,按钮如何如何

接着就是状态的转换了,这里需要明确状态如何转换,转换给谁,addTransition,当按下m_PlayStates[1]时,States[State][0]转换为States[State][2]状态

然后可以写写进入状态后会产生什么反应

void LyricWidget::createSignalsToSlots()

{

connect(m_MinButton,&QToolButton::clicked,this,&LyricWidget::showMinWindow);

connect(States[State][1],&QState::entered,this,&LyricWidget::pause);

connect(States[State][2],&QState::entered,this,&LyricWidget::play);

connect(States[State][0],&QState::entered,this,&LyricWidget::stop);

connect(m_PreviousSong,&QToolButton::clicked,this,&LyricWidget::previousSong);

connect(m_NextSong,&QToolButton::clicked,this,&LyricWidget::nextSong);


}

当进入States[State][2]状态时,播放音乐,唔唔,就这样

connect(m_Progress,&ProgressWidget::sliderMoved,m_Player,&QMediaPlayer::setPosition);
connect(m_Player,&QMediaPlayer::positionChanged,m_Progress,&ProgressWidget::setValue);
唔如果使用valueChanged和setPosition搭配会出现重复设置现象,具体为一卡一卡哒

bool MoveWidget::eventFilter(QObject *obj, QEvent *event)
{
const QPoint &Pos = mapFromGlobal(cursor().pos());
if(obj == m_Query)
{
.......
}
else if(obj == m_VolumeSlider)
{
.....

}
else if(obj == m_Volume)
{
.....
}
return QWidget::eventFilter(obj,event);
}噢。。。检查控件事件前需要 m_VolumeSlider->installEventFilter(this);安装事件过滤器,不然接收不了


唔。。。就这样

打包程序:基于Qt的音乐播放器

代码:基于QT的音乐播放器代码

欢迎留言~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: