Qt实现网易云音乐进度条效果

时间:2021-10-09 21:48:18

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

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

Qt实现网易云音乐进度条效果

代码:

?
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