QPropertyAnimation для вращающегося QWidget - PullRequest
0 голосов
/ 11 мая 2018

Я новичок в Qt и у меня возникли проблемы с вращением QWidget.

У меня есть QPixmap внутри QLabel.Я хочу анимировать его непрерывным вращением на 90 градусов.

Я знаю QPropertyAnimation и знаю, как его использовать, но я борюсь с тем, как использовать его для вращенияQWidget.Есть ли какой-нибудь простой способ достичь своей цели и вращать всю QLabel или QPixmap внутри нее с анимацией?Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Это демонстрация вращения QLabel/QPixmap с анимацией.нет необходимости использовать QPropertyAnimation.Потому что нет свойства rotate для QLabel или QPixmap.Так что QVariantAnimation make QPixmap вращается как анимация и использует QPixmap :: transformed , чтобы вращать его.Если вы хотите хорошо управлять анимацией растрового изображения, настоятельно рекомендуем 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;
};
0 голосов
/ 11 мая 2018

Поворот можно реализовать двумя способами:

1) Создать коллекцию статических изображений, каждое из которых представляет исходное растровое изображение, повернутое на некоторый угол.С помощью таймера вы можете изменить растровое изображение вашего ярлыка на одно из вашей коллекции.Это будет имитировать анимированное вращение.

2) Используйте одно растровое изображение и переопределите QLabel::painEvent() вашей метки, где вы должны вращать объект QPainter с функцией QPainter::rotate() каждый раз, когда вы перерисовываете метку.

...