单击按钮后如何顺序转换到不同的QStates

时间:2014-08-12 02:28:09

标签: c++ qt

我在QGraphicsView上显示了一个图像,我正在尝试使用状态机进行移动。单击图像后,我希望它向下移动200px,然后向右移动另一个200px。这是我到目前为止的代码,但问题是,不是按照需要移动L形状的图像而是对角移动,即不是从状态1转换到状态2然后转换到状态3,动画将状态1转换为状态3跳过状态2.

stateMachine = new QStateMachine(this);

QState *state_01 = new QState(stateMachine);
QState *state_02 = new QState(stateMachine);
QState *state_03 = new QState(stateMachine);

state_01->assignProperty(pixmap, "pos", QPointF(0, 0));
state_02->assignProperty(pixmap, "pos", QPointF(0, 200));
state_03->assignProperty(pixmap, "pos", QPointF(200, 200));

QAbstractTransition *transition_01 = state_01->addTransition(pixmap, SIGNAL(pixmapPressed()), state_02);
QAbstractTransition *transition_02 = state_02->addTransition(state_03);

transition_01->addAnimation(new QPropertyAnimation(pixmap, "pos"));
transition_02->addAnimation(new QPropertyAnimation(pixmap, "pos"));

stateMachine->setInitialState(state_01);
stateMachine->start();

我想我可能会误用状态2转换为状态3的声明,但我尝试了其他方法但没有成功。我没有尝试过的另一个想法就是检查图像是否已达到状态2的位置并以某种方式发出信号以开始下一次转换到状态3但我觉得也许我要求的可能都是完成状态机框架。如何在仅单击图像一次以启动整个过程后,如何让图像在3种状态中移动?

1 个答案:

答案 0 :(得分:0)

要将延迟过渡到其动画完成之前,您需要等待QState的propertiesAssigned()信号。

例如:

QAbstractTransition *transition_02 = state_02->addTransition(state_03);

将变为:

QAbstractTransition *transition_02 = state_02->addTransition(state_02, SIGNAL(propertiesAssigned()), state_03);

阅读https://doc.qt.io/qt-5/statemachine-api.html#detecting-that-all-properties-have-been-set-in-a-state了解更多信息。