用于旋转 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
。因为 QLabel
或 QPixmap
没有旋转 属性。所以使用 QVariantAnimation
使 QPixmap
旋转为动画并使用 QPixmap::transformed to rotate it. If you want well to control the animation of the pixmap, highly recommend QGraphicsPixmapItem 和 QPropertyAnimation
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;
};
我是 Qt 的新手,我在 QWidget
旋转方面遇到了一些问题。
我在 QLabel 中有一个 QPixmap。 我想要的是通过连续旋转 90 度来制作动画。
我知道 QPropertyAnimation
并且我知道如何使用它,但我正在努力研究如何使用它来旋转 QWidget
。有什么简单的方法可以实现我的目标并使用动画旋转整个 QLabel
或其中的 QPixmap
吗?
谢谢。
您可以通过两种方式实现旋转:
1) 创建一个 collection 静态图像,每个静态图像代表旋转了某个角度的原始像素图。使用计时器,您可以使用 collection 中的一个来更改标签的像素图。这将模仿动画旋转。
2) 使用单个像素图并覆盖标签的 QLabel::painEvent()
,每次重绘标签时,您应该在其中使用 QPainter::rotate()
函数旋转 QPainter
object。
这是QLabel/QPixmap
旋转动画的演示。
没有必要使用 QPropertyAnimation
。因为 QLabel
或 QPixmap
没有旋转 属性。所以使用 QVariantAnimation
使 QPixmap
旋转为动画并使用 QPixmap::transformed to rotate it. If you want well to control the animation of the pixmap, highly recommend QGraphicsPixmapItem 和 QPropertyAnimation
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;
};