基于QT的音乐播放器

---------》

唔。。。没有做任何样式,这只是练习状态机的一个副产品,当然必有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_PlayStates[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的音乐播放器代码



欢迎留言~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值