Как изменить размер QGraphicsPixmap с помощью анимации?

У меня есть класс с именем Pixmap, производный от QGraphicsPixmapItem и класс StartScreen, производный от QGraphicsScene. Я хочу использовать анимацию (класс QPropertyAnimation), чтобы изменить размер отображаемого изображения в определенный промежуток времени. Другие действия, такие как установка положения или поворота, не являются проблемой, но я не смог найти никакого свойства, например size (например, метод setSize ()). Как я могу сделать это по-другому? Спасибо за продвижение.

StartScreen::StartScreen(int windowWidth, int windowHeight)
{
setSceneRect(0, 0, windowWidth, windowHeight);
setBackgroundBrush(QBrush(QImage(":/images/background.png")));

Pixmap * logo = new Pixmap(":/images/logo.png");
addItem(logo);
logo->setPos((windowWidth - logo->pixmap().width()) / 2, (windowWidth - logo->pixmap().width()) / 2 - 75);

//QPropertyAnimation * animation = new QPropertyAnimation(logo, "");
}

0

Решение

QPropertyAnimation применяется к Qt Properties, но только к объектам, которые наследуются от QObject иметь свойства Qt, так что если вы хотите использовать анимацию, вы можете использовать QGraphicsObject и создать свой собственный элемент, или создать класс, который наследует элемент, который вы хотите, и QObject,

class Pixmap: public QObject, public QGraphicsPixmapItem{

Q_OBJECT
Q_PROPERTY(qreal scale READ scale WRITE setScale)
Q_PROPERTY(qreal rotation READ rotation WRITE setRotation)
Q_PROPERTY(QPointF pos READ pos WRITE setPos)
public:
using QGraphicsPixmapItem::QGraphicsPixmapItem;
};

В предыдущем примере воспользуйтесь тем, что QGraphicsItemи, следовательно, его производные классы, имеют методы pos(), setPos(), scale(), setScale(), rotation() а также setRotation()так что используйте их только в Q_PROPERTY,

В следующей части я покажу пример:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsView w;

QGraphicsScene scene(0, 0, 640, 480);
w.setScene(&scene);
w.show();

Pixmap* logo = new Pixmap(QPixmap(":/image.jpg"));
scene.addItem(logo);

QSequentialAnimationGroup group;

QPropertyAnimation animation_scale(logo, "scale");
animation_scale.setDuration(1000);
animation_scale.setStartValue(2.0);
animation_scale.setEndValue(0.1);

QPropertyAnimation animation_pos(logo, "pos");
animation_pos.setDuration(1000);
animation_pos.setStartValue(QPointF(0, 0));
animation_pos.setEndValue(QPointF(100, 100));

/**
* it must indicate the center of rotation,
* in this case it will be the center of the item
*/
logo->setTransformOriginPoint(logo->boundingRect().center());
QPropertyAnimation animation_rotate(logo, "rotation");
animation_rotate.setDuration(1000);
animation_rotate.setStartValue(0);
animation_rotate.setEndValue(360);

group.addAnimation(&animation_scale);
group.addAnimation(&animation_pos);
group.addAnimation(&animation_rotate);

group.start();

return a.exec();
}

#include "main.moc"

В следующих ссылка на сайт есть пример

Или вы можете использовать QVariantAnimation вместо QPropertyAnimation:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsView w;

QGraphicsScene scene(0, 0, 640, 480);
w.setScene(&scene);
w.show();

QGraphicsPixmapItem* logo = new QGraphicsPixmapItem(QPixmap(":/image.jpg"));
scene.addItem(logo);

QSequentialAnimationGroup group;

QVariantAnimation animation_scale;
animation_scale.setDuration(1000);
animation_scale.setStartValue(2.0);
animation_scale.setEndValue(0.5);

QObject::connect(&animation_scale, &QVariantAnimation::valueChanged, [logo](const QVariant &value){
logo->setScale(value.toReal());
});

animation_scale.start();

QVariantAnimation animation_pos;
animation_pos.setDuration(1000);
animation_pos.setStartValue(QPointF(0, 0));
animation_pos.setEndValue(QPointF(100, 100));

QObject::connect(&animation_pos, &QVariantAnimation::valueChanged, [logo](const QVariant &value){
logo->setPos(value.toPointF());
});

/**
* it must indicate the center of rotation,
* in this case it will be the center of the item
*/

logo->setTransformOriginPoint(logo->boundingRect().center());
QVariantAnimation animation_rotate;
animation_rotate.setDuration(1000);
animation_rotate.setStartValue(0);
animation_rotate.setEndValue(360);

QObject::connect(&animation_rotate, &QVariantAnimation::valueChanged, [logo](const QVariant &value){
logo->setRotation(value.toReal());
});

group.addAnimation(&animation_scale);
group.addAnimation(&animation_pos);
group.addAnimation(&animation_rotate);

group.start();

return a.exec();
}

В следующих ссылка на сайт есть пример

0

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

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

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