Qt网易云音乐中的音乐进度条是一个小小的难关,今天在Android写记录步数进度条中突然想到了它。移动端和电脑端自定义写界面模块的方式大同小异,现在将其中的代码放出,供大家点评参阅。代码还是比较混乱,请各位大侠还是要多多包涵。
其中我把这个类打包出来,类的实现就是靠painevent来完成的。其中的两个自定义信号是为了快进快退而准备的,它们的实现不在本类中,大小位置也是在外部类中实现。其中的一些位置参数,大小参数属于本身创作需要,如有迷惑,还望海涵。

代码:
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
#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;
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/ZQL2288/article/details/63696406








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。