基于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);安装事件过滤器,不然接收不了
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
唔。。。就这样
打包程序:基于Qt的音乐播放器
代码:基于QT的音乐播放器代码
欢迎留言~
相关文章推荐
- VS2010打开QtCreator工程(.pro)问题集锦
- QSqlDatabase: QMYSQL driver not loaded problem under qt5.5 in ubuntu14
- QT信号槽多次连接引起的错误修改
- Pyqt 浏览器自动填充input框小demo
- Qt相关问题
- QSerialPort
- Qt串口
- QtSerialPort include header
- jqTransform:呈现更美的表单
- Qt实现"颜色减淡"算法
- Qt加载本地html文件 并且调用JS的函数在Qt中使用
- QT下载地址记录
- Qt实现应用单实例运行(2)-使用自定义类
- qtablewidget 设置居中
- Qt实现应用单实例运行(1)-使用共享内存
- Qt学习笔记:小技巧
- Loadrunner运行QTP脚本
- Qt配置文件中文读写小例子
- QT用API获得文件的版本信息
- QT-Demo-Colck-01