QStateMachine 它是如何工作的

Posted

技术标签:

【中文标题】QStateMachine 它是如何工作的【英文标题】:QStateMachine how it works 【发布时间】:2016-06-06 19:13:10 【问题描述】:

我创建了 4 个不同的 QState,我想在每个状态转换中隐藏一个对象。

这是代码:

QStateMachine partita;

QState *inizio_mano = new QState();
QState *aspetto_G1_primo = new QState();
QState *aspetto_G1_secondo = new QState();
QFinalState *fine_mano = new QFinalState();

partita.setInitialState(inizio_mano);

inizio_mano -> addTransition(this,presa==true,aspetto_G1_primo);
inizio_mano -> addTransition(this,presa==false,aspetto_G1_secondo);
aspetto_G1_primo -> addTransition(this,stato==true,fine_mano);
aspetto_G1_secondo -> addTransition(this,stato==true,fine_mano);

presastato是两个bool我在下一步程序中改。

现在我有一个QGraphicsScene,并在场景中添加了一些QGraphicsPixmapItem

例如我要更新隐藏物品的场景:

if(presa==true) object1->hide(); 

我知道我必须更改 QState(在本例中从 inizio_mano 更改为 aspetto_G1_primo),并且我已经完成了添加转换。

但是我怎样才能隐藏那个项目呢?

如何将 QState aspetto_G1_primoobject1 -> hide(); 连接

我希望我解释正确。

我的主要问题是:如何为每个 QState 分配不同的场景配置?

【问题讨论】:

您写的addTransition 语句无效。 可以通过信号发射或接收事件触发转换。请修复您的代码以使其首先编译。 【参考方案1】:

您拥有QWidget 的所有属性:http://doc.qt.io/qt-5/qwidget.html#properties

每个子类也有自己的附加属性,在文档中。

所以你可以这样做:

aspetto_G1_primo->assignProperty(object1, "visible", false);

然后,当进入该状态时,object1 的“可见”属性将设置为 false

您也可以根据状态编辑任何其他属性,例如几何、样式表或标签文本...

【讨论】:

以上是关于QStateMachine 它是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

QStateMachine 如何在不同的 QState 中显示和隐藏 QGraphicsView 和 QObject

使用 QStateMachine 在菜单屏幕之间切换

同步 QStateMachine

SQL Server 2008R2 sys.dm_exec_procedure_stats - 上次执行时间异常

Visual c# 中的 _stat 替代方案

连续分布的 scipy.stats 属性“熵”不能手动工作