用于旋转 QWidget 的 QPropertyAnimation

QPropertyAnimation for rotating QWidget

我是 Qt 的新手,我在 QWidget 旋转方面遇到了一些问题。

我在 QLabel 中有一个 QPixmap。 我想要的是通过连续旋转 90 度来制作动画。

我知道 QPropertyAnimation 并且我知道如何使用它,但我正在努力研究如何使用它来旋转 QWidget。有什么简单的方法可以实现我的目标并使用动画旋转整个 QLabel 或其中的 QPixmap 吗? 谢谢。

您可以通过两种方式实现旋转:

1) 创建一个 collection 静态图像,每个静态图像代表旋转了某个角度的原始像素图。使用计时器,您可以使用 collection 中的一个来更改标签的像素图。这将模仿动画旋转。

2) 使用单个像素图并覆盖标签的 QLabel::painEvent(),每次重绘标签时,您应该在其中使用 QPainter::rotate() 函数旋转 QPainter object。

这是QLabel/QPixmap旋转动画的演示。 没有必要使用 QPropertyAnimation。因为 QLabelQPixmap 没有旋转 属性。所以使用 QVariantAnimation 使 QPixmap 旋转为动画并使用 QPixmap::transformed to rotate it. If you want well to control the animation of the pixmap, highly recommend QGraphicsPixmapItemQPropertyAnimation

class RotateMe : public QLabel {

    Q_OBJECT
public:
    explicit RotateMe(QWidget* parent = Q_NULLPTR) :
        QLabel(parent),
        pixmap(100, 100),
        animation(new QVariantAnimation )
    {
        resize(200, 200);
        pixmap.fill(Qt::red);

        animation->setDuration(10000);
        animation->setStartValue(0.0f);
        animation->setEndValue(90.0f);
        connect(animation, &QVariantAnimation::valueChanged, [=](const QVariant &value){
            qDebug()<<value;
            QTransform t;
            t.rotate(value.toReal());
            setPixmap(pixmap.transformed(t));
        });
        animation->start();
    }
private:
    QPixmap             pixmap;
    QVariantAnimation  *animation;
};