diff --git a/src/mainwindow-dtk.cpp b/src/mainwindow-dtk.cpp
index 8ffe662..3e51639 100644
--- a/src/mainwindow-dtk.cpp
+++ b/src/mainwindow-dtk.cpp
@@ -11,7 +11,7 @@
 #define AppPageSettings 3
 
 MainWindow::MainWindow(QWidget *parent)
-    : DBlurEffectWidget(parent)
+    : BaseWidgetOpacity(parent)
     , ui(new Ui::MainWindow)
 {
     ui->setupUi(this);
@@ -299,32 +299,3 @@ void MainWindow::on_pushButton_14_clicked()
         });
     }
 }
-
-
-/// @brief 窗口关闭事件
-/// @param event 
-void MainWindow::closeEvent(QCloseEvent *event)
-{
-    if (!closeWindowAnimation) {
-        QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
-        animation->setEasingCurve(QEasingCurve::OutQuart);
-        animation->setDuration(500);
-        animation->setStartValue(1.0);
-        animation->setEndValue(0.0);
-
-        QObject::connect(animation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value){
-            this->update();
-            // setWindowTitle(QString("ヾ(⌒∇⌒*)See You♪ - %1%").arg(int(value.toFloat() * 100)));
-        });
-
-        QObject::connect(animation, &QPropertyAnimation::finished, this, [=](){
-            closeWindowAnimation = true;
-            this->close();
-        });
-
-        animation->start();
-        event->ignore();
-    } else {
-        event->accept();
-    }    
-}
diff --git a/src/mainwindow-dtk.h b/src/mainwindow-dtk.h
index d50b234..1b2ea82 100644
--- a/src/mainwindow-dtk.h
+++ b/src/mainwindow-dtk.h
@@ -2,7 +2,6 @@
 #define MAINWINDOWDTK_H
 
 #include <DMainWindow>
-#include <DBlurEffectWidget>
 #include <DTitlebar>
 #include <DSearchEdit>
 #include <QGraphicsDropShadowEffect>
@@ -12,6 +11,7 @@
 #include <QDir>
 #include <QDesktopServices>
 
+#include "widgets/base/basewidgetopacity.h"
 #include "widgets/downloadlistwidget.h"
 #include "widgets/common/progressbutton.h"
 #include "utils/widgetanimation.h"
@@ -23,7 +23,7 @@ namespace Ui {
 class MainWindow;
 }
 
-class MainWindow : public DBlurEffectWidget
+class MainWindow : public BaseWidgetOpacity
 {
     Q_OBJECT
 
@@ -53,10 +53,6 @@ private slots:
     void onGetUrl(const QString &url);
     void on_pushButton_14_clicked();
 
-    // QWidget interface
-protected:
-    bool closeWindowAnimation = false;
-    void closeEvent(QCloseEvent *event) override;
 };
 
 #endif // MAINWINDOWDTK_H
diff --git a/src/spark-store.pro b/src/spark-store.pro
index 855f463..d01287b 100644
--- a/src/spark-store.pro
+++ b/src/spark-store.pro
@@ -58,7 +58,8 @@ SOURCES += \
         backend/downloadworker.cpp \
         pages/appintopage.cpp \
         widgets/big_image.cpp \
-        backend/image_show.cpp
+        backend/image_show.cpp \
+        widgets/base/basewidgetopacity.cpp
 
 HEADERS += \
         dbus/dbussparkstoreservice.h \
@@ -79,7 +80,8 @@ HEADERS += \
         backend/downloadworker.h \
         pages/appintopage.h \
         widgets/big_image.h \
-        backend/image_show.h
+        backend/image_show.h \
+        widgets/base/basewidgetopacity.h
 
 FORMS += \
         mainwindow-dtk.ui \
diff --git a/src/utils/widgetanimation.cpp b/src/utils/widgetanimation.cpp
index 7bf2a67..f74b130 100644
--- a/src/utils/widgetanimation.cpp
+++ b/src/utils/widgetanimation.cpp
@@ -25,7 +25,7 @@ void WidgetAnimation::widgetShake(QWidget *pWidget, int nRange)
     pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
 }
 
-void WidgetAnimation::widgetOpacity(QWidget *pWidget, bool isAppear)
+QPropertyAnimation* WidgetAnimation::createWidgetOpacity(QWidget *pWidget, bool isAppear)
 {
     QPropertyAnimation *animation = new QPropertyAnimation(pWidget, "windowOpacity", pWidget);
     //设置动画效果
@@ -42,6 +42,11 @@ void WidgetAnimation::widgetOpacity(QWidget *pWidget, bool isAppear)
         animation->setKeyValueAt(0, 1);
         animation->setKeyValueAt(1, 0);
     }
-    // 开始动画
-    animation->start();
+    return animation;
+}
+
+void WidgetAnimation::widgetOpacity(QWidget *pWidget, bool isAppear)
+{    
+    // 开始动画
+    createWidgetOpacity(pWidget, isAppear)->start();
 }
diff --git a/src/utils/widgetanimation.h b/src/utils/widgetanimation.h
index 0223e67..d50ec5f 100644
--- a/src/utils/widgetanimation.h
+++ b/src/utils/widgetanimation.h
@@ -10,6 +10,8 @@ class WidgetAnimation
 public:
     WidgetAnimation();
     static void widgetShake(QWidget *pWidget, int nRange);
+
+    static QPropertyAnimation* createWidgetOpacity(QWidget *pWidget, bool isAppear);
     static void widgetOpacity(QWidget *pWidget, bool isAppear);
 };
 
diff --git a/src/widgets/base/basewidgetopacity.cpp b/src/widgets/base/basewidgetopacity.cpp
new file mode 100644
index 0000000..34cfbb6
--- /dev/null
+++ b/src/widgets/base/basewidgetopacity.cpp
@@ -0,0 +1,37 @@
+#include "basewidgetopacity.h"
+
+#include <QCloseEvent>
+#include <QPropertyAnimation>
+
+BaseWidgetOpacity::BaseWidgetOpacity(QWidget *parent) : DBlurEffectWidget(parent)
+{
+//    WidgetAnimation::widgetOpacity(this,true);
+}
+
+/// @brief 窗口关闭事件
+/// @param event
+void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
+{
+    if (!closeWindowAnimation) {
+        QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
+        animation->setEasingCurve(QEasingCurve::OutQuart);
+        animation->setDuration(500);
+        animation->setStartValue(1.0);
+        animation->setEndValue(0.0);
+
+        QObject::connect(animation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value){
+            this->update();
+            // setWindowTitle(QString("ヾ(⌒∇⌒*)See You♪ - %1%").arg(int(value.toFloat() * 100)));
+        });
+
+        QObject::connect(animation, &QPropertyAnimation::finished, this, [=](){
+            closeWindowAnimation = true;
+            this->close();
+        });
+
+        animation->start();
+        event->ignore();
+    } else {
+        event->accept();
+    }
+}
diff --git a/src/widgets/base/basewidgetopacity.h b/src/widgets/base/basewidgetopacity.h
new file mode 100644
index 0000000..9d77dc3
--- /dev/null
+++ b/src/widgets/base/basewidgetopacity.h
@@ -0,0 +1,24 @@
+#ifndef BASEWIDGETOPACITY_H
+#define BASEWIDGETOPACITY_H
+
+#include <DBlurEffectWidget>
+
+DWIDGET_USE_NAMESPACE
+
+class BaseWidgetOpacity : public DBlurEffectWidget
+{
+    Q_OBJECT
+public:
+    explicit BaseWidgetOpacity(QWidget *parent = nullptr);
+
+signals:
+
+public slots:
+
+    // QWidget interface
+protected:
+    bool closeWindowAnimation = false;
+    void closeEvent(QCloseEvent *event) override;
+};
+
+#endif // BASEWIDGETOPACITY_H