diff --git a/src/mainwindow-dtk.cpp b/src/mainwindow-dtk.cpp
index 0524c2b..b728939 100644
--- a/src/mainwindow-dtk.cpp
+++ b/src/mainwindow-dtk.cpp
@@ -21,7 +21,7 @@ MainWindow::MainWindow(QWidget *parent)
     WidgetAnimation::widgetOpacity(this,true);
 
     downloadlistwidget = new DownloadListWidget;
-    downloadButton = new QPushButton(ui->titlebar);
+    downloadButton = new ProgressButton(ui->titlebar);
     backButtom = new QPushButton(ui->titlebar);
     ui->appintopage->setDownloadWidget(downloadlistwidget);
     ui->stackedWidget->setCurrentIndex(0);
@@ -75,7 +75,9 @@ MainWindow::MainWindow(QWidget *parent)
                                 QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#FFFFFF}\
                                 ");
             backButtom->setIcon(QIcon(":/icon/dark/back.svg"));
-            downloadButton->setIcon(QIcon(":/icon/dark/download.svg"));
+            downloadButton->setIcon(":/icon/dark/download.svg");
+            downloadButton->setBackgroundColor(QColor("#444444"));
+            downloadButton->setColor(QColor("#66CCFF"));
             ui->pushButton_14->setIcon(QIcon(":/icon/dark/update.svg"));
             int i = 0;
             while (i < ui->buttonGroup->buttons().size()) {
@@ -98,7 +100,9 @@ MainWindow::MainWindow(QWidget *parent)
                                 QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#000000}\
                                 ");
             backButtom->setIcon(QIcon(":/icon/light/back.svg"));
-            downloadButton->setIcon(QIcon(":/icon/light/download.svg"));
+            downloadButton->setBackgroundColor(QColor("#e3e4e4"));
+            downloadButton->setColor(QColor("#66CCFF"));
+            downloadButton->setIcon(":/icon/light/download.svg");
             ui->pushButton_14->setIcon(QIcon(":/icon/light/update.svg"));
             int i = 0;
             while (i < ui->buttonGroup->buttons().size()) {
@@ -123,7 +127,7 @@ MainWindow::MainWindow(QWidget *parent)
     });
 
     //初始化标题栏控件
-    connect(downloadButton, &QPushButton::clicked, [=]() {
+    connect(downloadButton, &ProgressButton::clicked, [=]() {
         QPoint pos;
         pos.setX(downloadButton->mapToGlobal(QPoint(0, 0)).x() + downloadButton->width() / 2 - downloadlistwidget->width() / 2);
         pos.setY(downloadButton->mapToGlobal(QPoint(0, 0)).y() + downloadButton->height() + 5);
@@ -188,6 +192,9 @@ MainWindow::MainWindow(QWidget *parent)
         this->setFocus();
     });
 
+    connect(downloadlistwidget, &DownloadListWidget::downloadProgress, this, [=](int i) {
+        downloadButton->setProgress(i);
+    });
     // 列表点击事件
     connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk) {
         openUrl(spk);
diff --git a/src/mainwindow-dtk.h b/src/mainwindow-dtk.h
index 2b01c16..d50b234 100644
--- a/src/mainwindow-dtk.h
+++ b/src/mainwindow-dtk.h
@@ -13,6 +13,7 @@
 #include <QDesktopServices>
 
 #include "widgets/downloadlistwidget.h"
+#include "widgets/common/progressbutton.h"
 #include "utils/widgetanimation.h"
 #include "dbus/dbussparkstoreservice.h"
 
@@ -42,7 +43,7 @@ private:
     QList<int> pageHistory;
 
     DownloadListWidget *downloadlistwidget;
-    QPushButton *downloadButton;
+    ProgressButton *downloadButton;
     QPushButton *backButtom;
     DSearchEdit *searchEdit = new DSearchEdit;
     Ui::MainWindow *ui;
diff --git a/src/spark-store.pro b/src/spark-store.pro
index bf51d71..855f463 100644
--- a/src/spark-store.pro
+++ b/src/spark-store.pro
@@ -4,7 +4,7 @@
 #
 #-------------------------------------------------
 
-QT       += core gui network concurrent webenginewidgets dbus
+QT       += core gui network concurrent webenginewidgets dbus svg
 
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
@@ -46,6 +46,7 @@ SOURCES += \
         pages/settingspage.cpp \
         utils/utils.cpp \
         utils/widgetanimation.cpp \
+        widgets/common/progressbutton.cpp \
         widgets/common/webenginepage.cpp \
         widgets/common/webengineview.cpp \
         widgets/downloadlistwidget.cpp \
@@ -66,6 +67,7 @@ HEADERS += \
         pages/settingspage.h \
         utils/utils.h \
         utils/widgetanimation.h \
+        widgets/common/progressbutton.h \
         widgets/common/webenginepage.h \
         widgets/common/webengineview.h \
         widgets/downloadlistwidget.h \
diff --git a/src/widgets/common/progressbutton.cpp b/src/widgets/common/progressbutton.cpp
new file mode 100644
index 0000000..4432b72
--- /dev/null
+++ b/src/widgets/common/progressbutton.cpp
@@ -0,0 +1,201 @@
+#include "progressbutton.h"
+#include <QPainter>
+#include <QPainterPath>
+#include <QRect>
+#include <QConicalGradient>
+#include <QVariantAnimation>
+#include <QSvgRenderer>
+ProgressButton::ProgressButton(QWidget *parent)
+    : QWidget{parent}
+{
+    //this->setWindowFlags(Qt::FramelessWindowHint);
+    this->setAttribute(Qt::WA_TranslucentBackground, true);
+    setMinimumWidth(36);
+    setMinimumHeight(36);
+    svgPath="";
+    backColor=Qt::transparent;
+    setMouseTracking(true);
+
+    connect(this,&ProgressButton::startProcessing,this,&ProgressButton::operationProcessing,Qt::QueuedConnection);
+}
+
+ProgressButton::~ProgressButton()
+{
+}
+
+void ProgressButton::paintEvent(QPaintEvent *event)
+{
+    QPainter painter(this);
+    painter.setRenderHint(QPainter::Antialiasing,true);
+    auto rect = event->rect();
+
+    if(buttonState == state::normal || buttonState == state::hover)
+    {
+        auto radiu = (rect.height() - 6) / 2;
+        painter.translate(rect.center());
+        painter.setPen(Qt::transparent);
+        painter.setBrush(QColor(buttonState == state::normal ? color : color.darker()));
+        //painter.drawEllipse(QPoint(0,0),radiu,radiu);
+
+        //radiu -= 3;
+        painter.setBrush(backColor);
+        painter.drawEllipse(QPoint(0,0),radiu,radiu);
+
+        QSvgRenderer m_svgRender;
+        m_svgRender.load(svgPath);
+        m_svgRender.render(&painter ,QRectF(-radiu / 2,-radiu / 2,radiu,radiu));
+    }
+    else if(buttonState == state::openProgress)
+    {
+        painter.translate(rect.center());
+        auto radiu = (rect.height() - 6) / 2 -3;
+        painter.setBrush(backColor);
+        painter.setPen(QPen(backColor,3));
+        painter.drawEllipse(QPoint(0,0),radiu,radiu);
+
+        painter.setPen(QPen(backColor,3));
+
+        QSvgRenderer m_svgRender;
+        m_svgRender.load(svgPath);
+        m_svgRender.render(&painter ,QRectF(-radiu / 2,-radiu / 2,radiu,radiu));
+
+        QRect rect = QRect(-radiu, -radiu,
+                           radiu*2, radiu*2);
+
+        painter.setPen(QPen(color.darker(100),3));
+        auto angle = progress * 360 / 100;
+        painter.drawArc(rect.adjusted(-3,-3,3,3),90 * 16,-static_cast<int>(angle * 16));
+    }
+    else if(buttonState == state::closeProgress)
+    {
+        auto radiu = (rect.height() - 6) / 2;
+        painter.translate(rect.center());
+        painter.setPen(Qt::transparent);
+        painter.setBrush(QColor(0, 0, 0, 63));
+        painter.drawEllipse(QPoint(0,0),radiu,radiu);
+
+        radiu -= 3;
+        painter.setBrush(backColor);
+        painter.drawEllipse(QPoint(0,0),radiu,radiu);
+
+        painter.setPen(QPen(color,3,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
+        painter.drawLine(QPoint(-radiu / 3,0),
+                         QPoint(-radiu / 5,radiu / 3));
+        painter.drawLine(QPoint(-radiu / 5,radiu / 3),
+                         QPoint(radiu / 4,-radiu / 4));
+    }
+}
+
+void ProgressButton::setProgress(int progress)
+{
+    buttonState = state::openProgress;
+    ProgressButton::progress = progress;
+    if(progress == 100)
+    {
+        buttonState = state::closeProgress;
+        update();
+        auto waterDrop = new WaterDrop();
+        waterDrop->move(this->mapToGlobal(this->rect().center()));
+        waterDrop->show();
+    }
+    repaint();
+    update();
+}
+
+void ProgressButton::setIcon(QString svgPATH)
+{
+    svgPath = svgPATH;
+    update();
+}
+
+void ProgressButton::setBackgroundColor(QColor color)
+{
+    backColor = color;
+    update();
+}
+
+void ProgressButton::setColor(QColor color)
+{
+    ProgressButton::color = color;
+    update();
+}
+
+void ProgressButton::leaveEvent(QEvent *event)
+{
+    if(buttonState == state::hover)
+    {
+        buttonState = state::normal;
+        update();
+    }
+    QWidget::leaveEvent(event);
+}
+
+void ProgressButton::mousePressEvent(QMouseEvent *event)
+{
+    if(buttonState == state::hover || buttonState == state::normal)
+    {
+        widthChangeValue = (this->width() - 6) / 2;
+        update();
+    }
+    else if(buttonState == state::closeProgress)
+    {
+        update();
+    }
+    emit clicked();
+    QWidget::mousePressEvent(event);
+}
+
+void ProgressButton::operationProcessing()
+{
+
+}
+
+const int RADIUS = 60;
+WaterDrop::WaterDrop(QWidget *parent)
+    : QWidget(parent)
+    , m_waterDropAnimation(nullptr)
+    , m_animationRadius(0)
+{
+    this->setFixedSize(QSize(RADIUS * 2, RADIUS * 2));
+    this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
+    this->setAttribute(Qt::WA_TranslucentBackground);
+    this->setAttribute(Qt::WA_DeleteOnClose);
+    m_waterDropAnimation = new QVariantAnimation(this);
+//    m_waterDropAnimation->setEasingCurve(QEasingCurve(static_cast<QEasingCurve::Type>(QRandomGenerator::global()->bounded(40))));
+}
+
+//把鼠标点击的点转换为圆心点坐标
+void WaterDrop::move(const QPoint &point)
+{
+    QPoint translatePoint = point - QPoint(RADIUS, RADIUS);
+    QWidget::move(translatePoint);
+}
+
+void WaterDrop::show()
+{
+    m_waterDropAnimation->setStartValue(0);
+    m_waterDropAnimation->setEndValue(RADIUS);
+    m_waterDropAnimation->setDuration(350);
+
+    connect(m_waterDropAnimation, &QVariantAnimation::valueChanged, this, &WaterDrop::onRaduisChanged);
+    connect(m_waterDropAnimation, &QVariantAnimation::finished, this, &WaterDrop::close);
+    m_waterDropAnimation->start();
+    QWidget::show();
+}
+
+void WaterDrop::paintEvent(QPaintEvent *event)
+{
+    QPainter painter(this);
+    painter.setRenderHint(QPainter::Antialiasing);
+    QPen pen;
+    pen.setColor(QColor(0xffffff80));
+    pen.setWidth(5);
+    painter.setPen(pen);
+    painter.drawEllipse(event->rect().center(),m_animationRadius, m_animationRadius);
+}
+
+void WaterDrop::onRaduisChanged(QVariant value)
+{
+    m_animationRadius = value.toInt();
+    update();
+}
diff --git a/src/widgets/common/progressbutton.h b/src/widgets/common/progressbutton.h
new file mode 100644
index 0000000..09ab919
--- /dev/null
+++ b/src/widgets/common/progressbutton.h
@@ -0,0 +1,74 @@
+#ifndef PROGRESSBUTTON_H
+#define PROGRESSBUTTON_H
+
+
+#include <QtWidgets/QWidget>
+
+#include <QPaintEvent>
+
+#include <QTimer>
+#include <QTimerEvent>
+#include<QColor>
+#include <QList>
+#include <QMouseEvent>
+
+
+class ProgressButton : public QWidget
+{
+    Q_OBJECT
+public:
+    ProgressButton(QWidget *parent = nullptr);
+    void setIcon(QString svgPATH);
+    void setBackgroundColor(QColor color);
+    void setColor(QColor color);
+    void setProgress(int progress);
+    ~ProgressButton();
+signals:
+    void startProcessing();
+    void clicked();
+
+protected:
+    void paintEvent(QPaintEvent *event)override;
+    void leaveEvent(QEvent *event)override;
+    void mousePressEvent(QMouseEvent *event)override;
+
+private:
+    enum class state
+    {
+        normal,
+        hover,
+        fromRoundedCornersToRounded,//从圆角变成圆形
+        openProgress,
+        closeProgress,
+        recovery
+    }
+    buttonState{state::normal};
+    QColor backColor;
+    QColor color;
+    QString svgPath;
+    int widthChangeValue{0};
+    void operationProcessing();
+    int progress{0};//处理百分比
+};
+
+class WaterDrop : public QWidget
+{
+    Q_OBJECT
+
+public:
+    WaterDrop(QWidget *parent = Q_NULLPTR);
+    void show();
+    void move(const QPoint &point);
+
+private:
+    void paintEvent(QPaintEvent *event);
+    void onRaduisChanged(QVariant value);
+
+private:
+    class QVariantAnimation* m_waterDropAnimation;
+    int m_animationRadius;
+};
+
+
+
+#endif // PROGRESSBUTTON_H
diff --git a/src/widgets/downloadlistwidget.cpp b/src/widgets/downloadlistwidget.cpp
index d4437a1..d2447e5 100644
--- a/src/widgets/downloadlistwidget.cpp
+++ b/src/widgets/downloadlistwidget.cpp
@@ -168,6 +168,7 @@ void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesR
     theSpeed = speedInfo;
     downloaditemlist[nowDownload - 1]->setMax(10000);   // 最大值
     downloaditemlist[nowDownload - 1]->setValue(int(bytesRead * 100 / totalBytes) * 100);  // 当前值
+    emit downloadProgress(int(bytesRead * 100 / totalBytes));
     download_size = bytesRead;
     if(downloaditemlist[nowDownload - 1]->close)
     {
diff --git a/src/widgets/downloadlistwidget.h b/src/widgets/downloadlistwidget.h
index 69f0140..81e674a 100644
--- a/src/widgets/downloadlistwidget.h
+++ b/src/widgets/downloadlistwidget.h
@@ -54,6 +54,7 @@ private slots:
     void on_pushButton_clicked();
 signals:
     void downloadFinished();
+    void downloadProgress(int i);
 };
 
 #endif // DOWNLOADLISTWIDGET_H