Как оживить линию вокруг фиксированной точки в Qt?

Я пытаюсь анимировать линию вокруг фиксированной точки в Qt. Я полагаю, мне нужно использовать QPropertyAnimation класс, чтобы сделать это, но не может выяснить, какое свойство использовать.

Для ясности вот что я пытаюсь сделать.

|        (5, 10)
|       /
|      /
|     /
|    /          (10, 5)
|   /          .
|  /
| /
|/
|--------------------------
^
|---(0,0)

Дано (x1, y1) = (0, 0) & (x2, y2) = (5, 10), это будет первый кадр анимации. Затем я хотел бы сделать плавную анимацию из (x1, y1), (x2, y2), (где (x1, y1) — один конец линии, а (x2, y2) — другой конец) в (x1 , y1), (x3, y3), где (x3, y3) = (10, 5). Подобно тому, как стрелка часов анимирована. И прежде чем кто-то постит аналоговые часы Например, он использует вращающийся pixmap что не то, что мне нужно.

Я не нашел много информации об анимации Qt, просто много базовых уроков по GUI.

Я пытался сделать следующее

QPropertyAnimation *anim = new QPropertyAnimation(widget, "geometry")

и проблема с этим методом заключается в том, что в этом методе виджет перемещается между 2 точками на основе (0, 0) виджета с использованием -> setStartValue (startX, startY, …) и не позволяет мне сохранить один из моих линий в фиксированной точке.

а также

QPropertyAnimation *anim = new QPropertyAnimation(widget, "rotation")

Проблема в том, что этот метод похож на геометрию в том, что он вращает указанный виджет вдоль (0, 0) точки.

Может кто-нибудь подсказать, как добиться желаемого эффекта?

Благодарю.

1

Решение

QGraphicsXXXItem не поддерживают q-свойства, поэтому их нельзя использовать с QPropertyAnimation непосредственно. Таким образом, решение заключается в создании класса, который наследует QObject а также QGraphicsLineItem, плюс мы должны добавить свойство q, которое обрабатывает p2 положение QLineF связанный с линией, как показано ниже:

lineitem.h

#ifndef LINEITEM_H
#define LINEITEM_H

#include <QGraphicsLineItem>
#include <QObject>

class LineItem: public QObject, public QGraphicsLineItem {
Q_OBJECT
Q_PROPERTY(QPointF p1 READ p1 WRITE setP1)
Q_PROPERTY(QPointF p2 READ p2 WRITE setP2)

public:
using QGraphicsLineItem::QGraphicsLineItem;

QPointF p1() const {
return  line().p1();
}

void setP1(const QPointF & p){
QLineF l = line();
l.setP1(p);
setLine(l);
}

QPointF p2() const {
return  line().p2();
}

void setP2(const QPointF & p){
QLineF l = line();
l.setP2(p);
setLine(l);
}
};

#endif // LINEITEM_H

main.cpp

#include "lineitem.h"
#include <QApplication>
#include <QGraphicsView>
#include <QPropertyAnimation>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene(-100, -100, 200, 200);
QGraphicsView view(&scene);

QGraphicsLineItem *item = scene.addLine(QLine(0, 100, 100, 0));
item->setPen(QPen(Qt::red, 5));

LineItem *lineItem = new LineItem(QLineF(QPointF(0, 0), QPointF(0, 100)));
scene.addItem(lineItem);
lineItem->setPen(QPen(Qt::green, 2));

QPropertyAnimation *anim = new QPropertyAnimation(lineItem, "p2");
anim->setStartValue(QPointF(0, 100));
anim->setEndValue(QPointF(100, 0));
anim->setDuration(2000);
anim->start();

view.resize(640, 480);
view.show();
return a.exec();
}

Другой способ — использовать QVariantAnimation:

#include <QApplication>
#include <QGraphicsView>
#include <QPropertyAnimation>
#include <QGraphicsLineItem>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene(-100, -100, 200, 200);
QGraphicsView view(&scene);

scene.addLine(QLine(0, 100, 100, 0), QPen(Qt::green));

QGraphicsLineItem *item = scene.addLine(QLine(0, 0, 0, 100));
item->setPen(QPen(Qt::red, 5));

QVariantAnimation * anim = new QVariantAnimation(&scene);
anim->setStartValue(QPointF(0, 100));
anim->setEndValue(QPointF(100, 0));
anim->setDuration(2000);
anim->start();

QObject::connect(anim, &QVariantAnimation::valueChanged, [item](const QVariant & val){
QLineF l = item->line();
l.setP2(val.toPointF());
item->setLine(l);
});

view.resize(640, 480);
view.show();
return a.exec();
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]