Files
cbh/ElaWidgetTools/DeveloperComponents/ElaThemeAnimationWidget.cpp
2025-09-20 01:41:33 +08:00

49 lines
2.2 KiB
C++

#include "ElaThemeAnimationWidget.h"
#include <QPainter>
#include <QPainterPath>
#include <QPropertyAnimation>
ElaThemeAnimationWidget::ElaThemeAnimationWidget(QWidget *parent) : QWidget{parent} { _pEndRadius = 0.01; }
ElaThemeAnimationWidget::~ElaThemeAnimationWidget() {}
void ElaThemeAnimationWidget::startAnimation(int msec) {
QPropertyAnimation *themeChangeAnimation = new QPropertyAnimation(this, "pRadius");
themeChangeAnimation->setDuration(msec);
themeChangeAnimation->setEasingCurve(QEasingCurve::InOutSine);
connect(themeChangeAnimation, &QPropertyAnimation::finished, this, [=]() {
Q_EMIT animationFinished();
this->deleteLater();
});
connect(themeChangeAnimation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value) { update(); });
themeChangeAnimation->setStartValue(0);
themeChangeAnimation->setEndValue(_pEndRadius);
themeChangeAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}
void ElaThemeAnimationWidget::paintEvent(QPaintEvent *event) {
QPainter painter(this);
painter.save();
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
painter.setPen(Qt::NoPen);
// 合成图片
QImage animationImage(_pOldWindowBackground.size(), QImage::Format_ARGB32);
animationImage.fill(Qt::transparent);
QPainter animationImagePainter(&animationImage);
animationImagePainter.setRenderHints(QPainter::Antialiasing);
animationImagePainter.drawImage(_pOldWindowBackground.rect(), _pOldWindowBackground);
animationImagePainter.setCompositionMode(QPainter::CompositionMode::CompositionMode_SourceOut);
qreal devicePixelRatioF = _pOldWindowBackground.devicePixelRatioF();
QPainterPath clipPath;
clipPath.moveTo(_pCenter.x() * devicePixelRatioF, _pCenter.y() * devicePixelRatioF);
clipPath.addEllipse(QPointF(_pCenter.x() * devicePixelRatioF, _pCenter.y() * devicePixelRatioF), _pRadius * devicePixelRatioF,
_pRadius * devicePixelRatioF);
animationImagePainter.setClipPath(clipPath);
animationImagePainter.drawImage(animationImage.rect(), animationImage);
animationImagePainter.end();
painter.drawImage(rect(), animationImage);
painter.restore();
}