gpt4 book ai didi

c++ - QPropertyAnimation 没有保存小部件的最后位置

转载 作者:行者123 更新时间:2023-11-30 03:31:27 28 4
gpt4 key购买 nike

我正在尝试使用多个 QPropertyAnimation 向上移动一个小部件,然后向右移动。

代码如下:

QPropertyAnimation* animationUp;
QPropertyAnimation* animationRight;

QSequentialAnimationGroup *group;

animationUp = new QPropertyAnimation(this->ui->pushButton_2, "geometry");
animationUp->setStartValue(QRect(this->ui->pushButton_2->pos().x(), this->ui->pushButton_2->pos().y(), buttonWidth, buttonHeight));
animationUp->setEndValue(QRect(this->ui->pushButton_2->pos().x(), this->ui->pushButton_2->pos().y() - 60, buttonWidth, buttonHeight));

animationRight = new QPropertyAnimation(this->ui->pushButton_2, "geometry");
animationRight->setStartValue(QRect(this->ui->pushButton_2->pos().x(), this->ui->pushButton_2->pos().y(), buttonWidth, buttonHeight));
animationRight->setEndValue(QRect(this->ui->pushButton_2->pos().x() + 60, this->ui->pushButton_2->pos().y(), buttonWidth, buttonHeight));

group = new QSequentialAnimationGroup;
group->addAnimation(animationUp);
group->addAnimation(animationRight);

group->start();

问题很简单,小部件将向上移动,然后从起始位置向右移动,而不是从向上移动后的位置向右移动。我希望它从最后一个位置向上移动,而不是从起始位置开始。

编辑:

对于我提出的问题,@eyllanesc 的回答很好,但我应该更精确地说明我打算做什么。向上和向右动画只是一个测试,我的目标是能够向上、向下、向左或向右移动按钮,并可能在同一方向上进行多次移动。例如,它可能是这样的:

group->addAnimation(animationUp);
group->addAnimation(animationUp);
group->addAnimation(animationUp);
group->addAnimation(animationRight);
group->addAnimation(animationDown);
group->addAnimation(animationLeft);
group->addAnimation(animationLeft);

group->start();

在这种情况下,答案不再有效。我尝试了 2 种设置并遇到了不同的问题:

//Setting 1 : Only one of the Up animation is showed, the other is ignored

group->addAnimation(animationUp);
group->addAnimation(animationUp);
group->addAnimation(animationRight);


//Setting 2 : Up and Right working fine but the last Up starts from the starting position

group->addAnimation(animationUp);
group->addAnimation(animationRight);
group->addAnimation(animationUp);

最佳答案

问题是您要根据按钮的初始位置分配位置,您必须创建一个 QRect 变量并使用 translate()

QPropertyAnimation* animationUp;
QPropertyAnimation* animationRight;

QSequentialAnimationGroup *group;

QRect r(ui->pushButton_2->pos(), QSize(buttonWidth, buttonHeight));

animationUp = new QPropertyAnimation(ui->pushButton_2, "geometry");
animationUp->setStartValue(r);
r.translate(0, -60);
animationUp->setEndValue(r);

animationRight = new QPropertyAnimation(ui->pushButton_2, "geometry");
animationRight->setStartValue(r);
r.translate(60, 0);
animationRight->setEndValue(r);

group = new QSequentialAnimationGroup;
group->addAnimation(animationUp);
group->addAnimation(animationRight);

group->start();

此外,如果您不打算更改按钮的大小,您可以使用位置而不是几何图形。

ui->pushButton_2->resize(buttonWidth, buttonHeight);
QPropertyAnimation* animationUp;
QPropertyAnimation* animationRight;

QSequentialAnimationGroup *group;
QPoint p = ui->pushButton_2->pos();


animationUp = new QPropertyAnimation(ui->pushButton_2, "pos");
animationUp->setStartValue(p);
p += QPoint(0, -60);
animationUp->setEndValue(p);

animationRight = new QPropertyAnimation(ui->pushButton_2, "pos");
animationRight->setStartValue(p);
p += QPoint(60, 0);
animationRight->setEndValue(p);

group = new QSequentialAnimationGroup;
group->addAnimation(animationUp);
group->addAnimation(animationRight);

group->start();

更新:一个简单的方法是通过放置可能的 Action 来创建一个枚举并创建一个新的动画,动画不引用以前的状态。

enum Movements{ Up, Down,Right, Left};
const auto dir = QList<QPoint>()<< QPoint(0, -1) << QPoint(0, 1)<<QPoint(1, 0)<<QPoint(-1, 0);


ui->pushButton_2->resize(buttonWidth, buttonHeight);

auto group = new QSequentialAnimationGroup;
QList<Movements> Sequence_of_movements;

Sequence_of_movements << Up << Up << Up << Right<<Down<<Left<<Left;

auto p = ui->pushButton_2->pos();
int step = 60;
for(auto i: Sequence_of_movements){
auto animation = new QPropertyAnimation(ui->pushButton_2, "pos");
animation->setStartValue(p);
p += step*dir.at(i);
animation->setEndValue(p);
group->addAnimation(animation);
}

group->start();

关于c++ - QPropertyAnimation 没有保存小部件的最后位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44220986/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com