概述
Qt 动画效果,图片旋转
Qt loading 样式 图片旋转
图片旋转可以使用paintevent时间,也可以使用过滤器实现。如下为使用过滤器的方式实现图片旋转。
- 首先在 UI 中绘制 一个 QLabel 用于承载旋转图片。
ui->labelLoadIcon- 然后给载体安装过滤器事件,保证其可触发的状态
ui->labelLoadIcon->installEventFilter(this);- 写过滤器要实现的功能,旋转
bool QAuthInit::eventFilter(QObject* watched, QEvent* event)
{
if (watched == ui->labelLoadIcon && event->type() == QEvent::Paint && !this->parentWidget()->isHidden())
{
QImage loading = QImage(":/loading.jpg");
QPainter painter_inner(ui->labelLoadIcon);
painter_inner.setPen(Qt::NoPen);
painter_inner.setBrush(Qt::NoBrush);
painter_inner.setRenderHint(QPainter::SmoothPixmapTransform);
painter_inner.translate(loading.width() / qreal(2) + 0, loading.height() / qreal(2) + 0); //设置旋转中心
painter_inner.rotate(-m_nAngle_ring); //旋转
painter_inner.translate(-(loading.width() / qreal(2) + 0), -(loading.height() / qreal(2) + 0)); //将原点复位
painter_inner.drawImage(QPointF(0, 0), loading);
}
// 事件仍然抛给QT
return QWidget::eventFilter(watched, event);
}- 定时调用,使过滤器中旋转的角度变化,从而达到旋转的效果
QTimer* timerLoading = new QTimer(this);
timerLoading->setInterval(5);
connect(timerLoading, &QTimer::timeout, this, &LoadingWidget::onTimeOut); // 在槽函数中修改 m_nAngle_ring 的值
timerLoading->start();- 定时器槽函数
void LoadingWidget::onTimeOut()
{
if (!this->parentWidget()->isHidden())
{
//每次间隔转2度,也就是说转一圈需要180次
if (m_nAngle_ring == 360)
{
m_nAngle_ring = 0;
}
m_nAngle_ring += 2;
ui->labelLoadIcon->update();
}
}