当界面在加载数据时,为呈现加载的动画效果,可用一个刷新图标旋转表示,代码如下:
rotatewgt.h
#ifndef ROTATEWGT_H
#define ROTATEWGT_H
#include <QWidget>
#include <QTimer>
#include <QPaintEvent>
class QPixmap;
class RotateWgt : public QWidget
{
Q_OBJECT
public:
explicit RotateWgt(const QString &icon, QWidget *parent = nullptr);
~RotateWgt();
void loadImg(const QString &iconPath);
private:
void init();
protected:
void showEvent(QShowEvent *);
void hideEvent(QHideEvent *);
void paintEvent(QPaintEvent *);
private slots:
void onRotateTimer();
private:
qreal m_rotateAlpha = 0;
QPixmap m_paintBuffer;
QTimer *m_rotateTimer = nullptr;
int m_width = 0;
int m_height = 0;
int m_interval = 100;
};
#endif // ROTATEWGT_H
rotatewgt.cpp
#include "rotatewgt.h"
#include <QPixmap>
#include <QPainter>
RotateWgt::RotateWgt(const QString &icon, QWidget *parent) : QWidget(parent)
{
init();
loadImg(icon);
}
RotateWgt::~RotateWgt()
{
if (m_rotateTimer) {
if (m_rotateTimer->isActive()) {
m_rotateTimer->stop();
}
delete m_rotateTimer;
m_rotateTimer = nullptr;
}
}
void RotateWgt::loadImg(const QString &iconPath)
{
m_paintBuffer.load(iconPath);
QSize iconSize = m_paintBuffer.size();
m_width = iconSize.width();
m_height = iconSize.height();
this->setFixedSize(iconSize);
}
void RotateWgt::init()
{
m_rotateTimer = new QTimer(this);
connect(m_rotateTimer, &QTimer::timeout, this, &RotateWgt::onRotateTimer);
}
void RotateWgt::showEvent(QShowEvent *)
{
if (m_rotateTimer && !m_rotateTimer->isActive())
m_rotateTimer->start(m_interval);
}
void RotateWgt::hideEvent(QHideEvent *)
{
if (m_rotateTimer && m_rotateTimer->isActive())
m_rotateTimer->stop();
}
void RotateWgt::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing |QPainter::SmoothPixmapTransform);
painter.translate(m_width / 2, m_height / 2);
painter.rotate(m_rotateAlpha);
painter.drawPixmap(QRect(-m_width / 2, -m_height / 2, m_width, m_height), m_paintBuffer);
painter.resetTransform(); //重置坐标系
}
void RotateWgt::onRotateTimer()
{
m_rotateAlpha += 30;
if (m_rotateAlpha >= 360)
m_rotateAlpha = 0;
this->update();
}