问题标签 [qstatemachine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
212 浏览

c++ - 具有 RestoreProperty 的 QStateMachine 在转换时失去了属性

状态机的 Qt 文档显示了我正在使用的两个原则:Restoring PropertiesTargetless transitions。第一个允许将属性分配给 QState,第二个允许仅在特定状态下触发事件。

当我结合这两个功能时,恢复属性不再起作用。当 aQSignalTransition被触发时,属性被设置为它们的初始值(在状态机启动之前),即使当前状态没有离开。

我有一个简短的例子来重现这个:

它有两个按钮:状态按钮在 S1 和 S2 之间切换,触发按钮在 S1 处于活动状态时触发 QSignalTransition。当 S1 处于活动状态时单击触发器,按钮文本将设置回"Not set". 如果我理解setGlobalRestorePolicy()正确的概念,属性应该保持"S1",因为它是状态 S1 的值,并且状态没有离开并且仍然处于活动状态。

有什么我错过或误解的,还是我做错了什么?

我在 Windows 上使用 Qt 4.8.4,如果这有什么不同的话。

0 投票
0 回答
1755 浏览

qt - 在 Qt 的 QStateMachine 中实现事件转换和保护条件

我试图了解 QStateMachine 的用法,特别是处理触发转换的用户事件。此外,我想了解实施警卫的最佳方式。我在下面画了一个状态机。它主要是顺序的,不是状态机的一个很好的例子,但它可以达到不阻塞的目的,因为在等待 QProcess 调用的结果时会有延迟。相反,这些延迟作为超时事件异步处理。

状态机在启动时假定没有 rndis 连接,然后定期运行更长的事件序列来检查连接。一旦检测到连接,就会定期运行较短的检查以确保我们仍然连接,如果没有,则返回运行较长的检查。

这是一些不完整的基本设置代码。

我可以在 Detector 对象上调用 startTimer,这是代码所在的位置。然后在 Detector::timerEvent 中,我可以将用户定义的“超时”事件发布到状态机。我还需要在每次转换时启动一个新计时器。每个转换的动作将发生在 QEventTransition 的子类中,大概是在“onTransition”方法中。如何将 Detector 对象传递给每个(唯一)转换对象,以便 Detector 是调用 startTimer() 的对象?另外,我不确定如何在具有它们的两个转换上实现保护条件。我在 QAbstractTransition 中看到了虚拟的“eventTest”,但不太了解它如何用于实现防护。我很确定我的想法还不是 Qt 的方式。

我看过我能找到的两本关于 Qt 的书(来自 Summerfield 和来自 Ezust)以及:http ://doc.qt.io/qt-5/statemachine-api.html#events-transitions-and-守卫。这些书根本没有提到 QStateMachine。在我看来,Qt 在线文档缺少足够的通用状态机示例代码。它很好地展示了如何使用现有信号来创建转换,而不是用户定义的事件。

欢迎任何帮助。谢谢。

简单检测状态机

编辑:我意识到我可以在 Detector::timerEvent() 函数中使用基本的 switch 语句来实现我自己的简单状态机。我现在正在这样做,但我仍然很想了解如何使用 QStateMachine 来完成

0 投票
1 回答
604 浏览

c++ - 如何从状态对象本身而不是外部更改状态?

cpp文件是

我想要做的是当getSettings()被调用时,我想将状态更改为下一个。我以为我会emit exited(),但它没有建立。我试图创建自己的信号nextState(),但如果我在这个函数中发出,它也不会编译。

使用上面的代码,错误是:

ListenState.cpp:23: 错误: C2664: 'QAbstractState::exited' : 无法将参数 1 从 'QEvent::Type' 转换为 'QAbstractState::QPrivateSignal' 没有可以执行此转换的用户定义转换运算符,或无法调用操作员

如果我发出自己的信号,emit nextState();错误是:

ListenState.obj:-1:错误:LNK2001:未解析的外部符号“public:void __thiscall ListenState::nextState(void)”(?nextState@ListenState@@QAEXXZ)

当我处于原始状态时,有没有办法触发从一个状态到另一个状态的转换?

0 投票
2 回答
3516 浏览

c++ - 如果 QStateMachine 中的转换成功,则从类发出信号

我的问题如下:我需要创建包含 QStateMachine 实例的类。这个类应该有插槽,您可以通过这些插槽“要求”状态机转换到另一个状态。如果转换成功,我的班级应该发出关于它的信号。我将如何实现这一点?类应该有能力根据特定的插槽调用发出特定的信号。这是一个类的小例子:

我将非常感谢您的帮助!

UPD:
插槽代表不同类型的转换,因此外部类(将使用MyClass)可以“要求”一些转换。因此,插槽将事件或信号发送到状态机,它会查看事件或信号并(如果处于正确状态)进行此转换。我想用某个信号通知外部类,该信号在插槽(转换)成功之前询问。

0 投票
1 回答
678 浏览

qt - QDialog 关闭时如何终止 QStateMachine?

我有一个 QDialog 和 QStateMachine。此循环在所有应用程序关闭时终止,但我想在 Qdialog 关闭时终止循环。我怎样才能做到这一点?

0 投票
1 回答
319 浏览

c++ - Qt 客户端应用程序在等待服务器响应期间停止

问题:
如果在指定时间内没有从服务器获得响应,则使用 While 循环检查条件并使用计时器。

操作系统: Linux
SDK: QT 5.5

描述:

我已经实现了一个客户端,并且在代码中有一个 while 循环,它不断检查某些条件(“检查机器已启动”)是否为真。当它从机器 Server 收到一些消息时,这种情况会发生变化。当我实现 while 循环时,它卡在其中并且不会出来。我在这个论坛上解雇了 Question,有人很好地指出了我的错误,他建议我应该使用 QStateMachine,因为我的 while 循环正在吃掉我所有的资源。

因此,在谷歌搜索更多关于状态机的信息时,我遇到了 QCoreApplication::processEvents()。当我在我的代码中添加它时,一切都按预期工作,但计时器部分仍然超时。现在我的问题是

1) QStateMachine 和 QCoreApplication::processEvents() 有什么区别 & 哪个更好。

2)如何正确使用QTimer,使while循环中的if条件在规定时间内不成立,只是超时并跳过while循环。

0 投票
1 回答
1907 浏览

c++ - Qt 状态机:如何将单个转换与多个状态相关联

问题

我目前正在使用 Qt 状态机框架开发一个应用程序,我的目标是将单个转换与多个源状态相关联。这样做的理由是导致转换的信号独立于源状态,因此我认为最好有一个而不是多个转换(每个源状态一个)。我在通过 Qt 实现上述目标时遇到了问题。下面使用测试状态机演示了详细信息。(下面提到的是一个假设的状态机,但我也可以为这种用例提供​​一些真实世界的示例)。请提出一些实现上述目标的有效方法。

问题所在的代码片段

在此处输入图像描述

CState.hpp

CTestMachine.hpp

CTestMachine.cpp

0 投票
2 回答
371 浏览

c++ - QStateMachine - QMouseEvent

在另一个问题中,您告诉我使用 QStateMachine。

我是 Qt 新手,这是我第一次使用这些对象,所以我犯了很多逻辑错误,所以使用 QStateMachine 这是一个大问题......

这是唯一的方法吗?我试着解释我的程序:

我想创建一个纸牌游戏,在以前的版本中,我使用了一个带有以下命令序列的旧图形库:

这样我告诉程序:

现在我想改变程序图形,我已经介绍了 QGraphics。我创建了一个场景并在其上打印所有对象“卡片”,所以现在我想告诉程序:

问题是我使用for1 到 20(我必须在一场比赛中跑 20 次)。我尝试使用随机的 G1 和 COM 播放来启动程序,但应用程序冻结到最后一次执行,for并且我在场景上仅打印卡的最后配置。这就是原因,因为之前我说过我希望程序停止......

没有 QStateMachine 可以吗?简单地告诉他:“暂停”,打印这种情况,等待鼠标继续?

0 投票
1 回答
263 浏览

c++ - QStateMachine 它是如何工作的

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

这是代码:

presa并且statobool我在下一步程序中更改的两个。

现在我有一个QGraphicsSceneand 在场景中我添加了一些QGraphicsPixmapItem.

例如我想更新隐藏项目的场景:

我知道我必须更改 QState (在这种情况下从inizio_manoto aspetto_G1_primo),并且我已经完成了添加转换。

但是我怎样才能隐藏那个 Item ?

如何将 QStateaspetto_G1_primoobject1 -> hide();

我希望我解释正确。

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

0 投票
1 回答
775 浏览

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

这是我的简单代码:

我创建了一个新的sceneview并且QPixmapItem

接下来我QStateMachine用两个创建了一个新的QState

  1. 我想显示viewins1并设置object1可见。

  2. 通过在场景上单击鼠标,我添加了一个过渡到s2.

  3. s2我只想隐藏object1

我怎样才能做到这一点?有人可以帮我做一个小教程吗?

我将 Qt 5.6.0 与 MinGW 4.9.2 32 位一起使用。