【Qt】图片旋转

Qt loading 样式 图片旋转

图片旋转可以使用paintevent时间,也可以使用过滤器实现。如下为使用过滤器的方式实现图片旋转。

  1. 首先在 UI 中绘制 一个 QLabel 用于承载旋转图片。
1
ui->labelLoadIcon
  1. 然后给载体安装过滤器事件,保证其可触发的状态
1
ui->labelLoadIcon->installEventFilter(this);
  1. 写过滤器要实现的功能,旋转
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
}
  1. 定时调用,使过滤器中旋转的角度变化,从而达到旋转的效果
1
2
3
4
5
6
7
QTimer* timerLoading = new QTimer(this);

timerLoading->setInterval(5);

connect(timerLoading, &QTimer::timeout, this, &LoadingWidget::onTimeOut); // 在槽函数中修改 m_nAngle_ring 的值

timerLoading->start();
  1. 定时器槽函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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();
}
}

【Qt】图片旋转
https://hodlyounger.github.io/B_Code/Qt/【Qt】图片旋转/
作者
mingming
发布于
2023年10月27日
许可协议