Files
cbh/ElaWidgetTools/DeveloperComponents/ElaThemeAnimationWidget.cpp
2025-09-19 22:40:52 +08:00

58 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();
}