Qt音乐进度条的实现仿网易云音乐

 Qt网易云音乐中的音乐进度条是一个小小的难关,今天在Android写记录步数进度条中突然想到了它。移动端和电脑端自定义写界面模块的方式大同小异,现在将其中的代码放出,供大家点评参阅。代码还是比较混乱,请各位大侠还是要多多包涵。

其中我把这个类打包出来,类的实现就是靠painevent来完成的。其中的两个自定义信号是为了快进快退而准备的,它们的实现不在本类中,大小位置也是在外部类中实现。其中的一些位置参数,大小参数属于本身创作需要,如有迷惑,还望海涵。

#ifndef DOWN_PROGRESSBARWIDGET_H
#define DOWN_PROGRESSBARWIDGET_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QPaintEvent>
#include <QPainter>
#include <QMouseEvent>
#include <QPalette>
#include <QTimer>

class down_progressbarWidget : public QWidget
{
    Q_OBJECT
public:
    QString s="0:0";
    QString t="0:0";
    explicit down_progressbarWidget(QWidget *parent = 0);
    void changPosition(qint64 xx);
private:
    int X=56;
    qint64 druntime;//总进度
    qint64  positontime;//当前进度
    QLabel *liftLabel;//左时间显示
    QLabel *rightLabel;//右边时间显示
    QTimer *timer3;//刷新
    void paintEvent(QPaintEvent* event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
signals:
    void changeX();//自定义一个信号
public slots:
    void updatepos();
};

#endif // DOWN_PROGRESSBARWIDGET_H

#include "down_progressbarwidget.h"

down_progressbarWidget::down_progressbarWidget(QWidget *parent) : QWidget(parent)
{
    QPalette pal;
    pal.setColor(QPalette::WindowText,QColor(255,255,255));
    QFont font("Courier",10);
    liftLabel=new QLabel(this);
    rightLabel=new QLabel(this);
    liftLabel->setAlignment(Qt::AlignCenter);
    rightLabel->setAlignment(Qt::AlignCenter);
    liftLabel->setGeometry(0,10,50,50);
    rightLabel->setGeometry(640,10,50,50);
    rightLabel->setFont(font);
    liftLabel->setFont(font);
    liftLabel->setPalette(pal);
    rightLabel->setPalette(pal);
    timer3=new QTimer(this);
    timer3->setInterval(1000);
    connect(timer3,SIGNAL(timeout()),this,SLOT(updatepos()));
}
void down_progressbarWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::SmoothPixmapTransform);
    painter.setRenderHint(QPainter::Antialiasing);
    QColor baseColor(0,20,20);
    QColor inColor(255,0,0);
    QColor outColor(255,255,255);
    painter.save();
    painter.setPen(Qt::NoPen);
    painter.setBrush(baseColor);
    QRectF rect=QRectF(55,32,580,6);
    painter.drawRoundedRect(rect,3,3);
    painter.restore();
    painter.save();
    painter.setPen(Qt::NoPen);
    painter.setBrush(inColor);
    QRectF playrect=QRectF(55,32,X-63,6);
    painter.drawRoundedRect(playrect,3,3);
    painter.restore();
    painter.setPen(Qt::NoPen);
    painter.setBrush(outColor);
    painter.drawEllipse(X-7,25,20,20);
    painter.restore();
    painter.save();
    painter.setPen(Qt::NoPen);
    painter.setBrush(inColor);
    painter.drawEllipse(X,32,6,6);
    painter.restore();
}
void down_progressbarWidget::mousePressEvent(QMouseEvent *event)
{
    if(event->pos().y()>30&&event->pos().y()<50)
    {
            int value;
            value=event->pos().x();
            if(value<55)
            {
                X=56;
            }
            else if(value>635)
            {
                X=620;
            }
            else
            {
                X=value;
            }
            if(X<=620)
            {
                emit changeX();
            }
           update();
           setCursor(Qt::PointingHandCursor);
    }
    else
    {
        event->ignore();
    }
}
void down_progressbarWidget::mouseMoveEvent(QMouseEvent *event)//可以进行拖动
{
        int value;
        value=event->pos().x();
        if(value<55)
        {
            X=56;
        }
        else if(value>635)
        {
            X=620;
        }
        else
        {
            X=event->pos().x();
        }
   
       emit changeX();//自定义了一个信号
       update();
       setCursor(Qt::PointingHandCursor);
}
/*
 * 外部使用一个定时器每隔1秒触发这个程序进行更新
*/
void down_progressbarWidget::updatepos()//显示歌曲时间进度
{
    float a;
    a=(float)positontime/(float)druntime;
    X=a*580+56;
    qint64 time=druntime;
    double secondDouble=time/1000;
    int minint=secondDouble/60;
    int secondint=secondDouble-minint*60;
    double secondtime1=positontime/1000;
    int minint1=secondtime1/60;
    int secondint1=secondtime1-minint1*60;
    t=QString("%0:%1").arg(QString::number(minint1),QString::number(secondint1));
    s=QString("%0:%1").arg(QString::number(minint),QString::number(secondint));
    rightLabel->setText(s);
    liftLabel->setText(t);
    update();
}
void down_progressbarWidget::changPosition(qint64 xx)//外部写入当前时间
{
    this->positontime=xx;
}
谢谢。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值