qt 进度条最小_Qt实现网易云音乐进度条效果

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

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

代码:

#ifndef DOWN_PROGRESSBARWIDGET_H

#define DOWN_PROGRESSBARWIDGET_H

#include

#include

#include

#include

#include

#include

#include

#include

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;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值