问题标签 [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 投票
6 回答
3703 浏览

c++ - 面对非阻塞I/O,如何设计状态机?

我正在使用默认情况下具有非阻塞 I/O 的 Qt 框架来开发一个应用程序,该应用程序在多个网页(在线商店)中导航并在这些页面上执行不同的操作。我正在将特定网页“映射”到我用来浏览此页面的状态机。
这个状态机有这些转换;
Connect, LogIn, Query, LogOut, Disconnect
和这些状态;
Start, Connecting, Connected, LoggingIn, LoggedIn, Querying, QueryDone, LoggingOut, LoggedOut, Disconnecting, Disconnected
从 *ing 到 *ed 状态 ( Connecting->Connected) 的转换是由于在LoadFinished加载当前请求的 url 时从网络对象接收到的异步网络事件。从 *ed 到 *ing 状态 ( Connected->LoggingIn) 的转换是由于我发送的事件。
我希望能够向这台机器发送多个事件(命令)(如 Connect、LogIn、Query("productA")、Query("productB")、LogOut、LogIn、Query("productC")、立即处理它们。我不想阻止等待机器完成处理我发送给它的所有事件。问题是它们必须与上述网络事件交错,通知机器正在下载的 url。没有交错机器就无法推进其状态(并处理我的事件),因为从 *ing 推进到 *ed 只有在接收到网络类型的事件之后才会发生。

如何实现我的设计目标?

编辑

  1. 我正在使用的状态机有自己的事件循环,并且事件没有在其中排队,因此如果机器忙时它们来了,机器可能会错过它们。
  2. 网络 I/O 事件既不会直接发布到状态机,也不会直接发布到我正在使用的事件队列中。它们被发布到我的代码(处理程序)中,我必须处理它们。我可以随心所欲地转发它们,但请记住没有。1.
  3. 看看我对这个问题的回答,我在其中详细描述了我当前的设计。问题是我是否以及如何通过制作它来改进这个设计

    • 更强大
    • 更简单
0 投票
1 回答
563 浏览

qt - 如果 QStateMachine 已经启动,我可以添加状态、转换、属性吗?

我有一些关于状态没有设置属性的问题。问题可能是因为我在机器启动后添加了属性并且我正在添加到当前状态。但是我需要在机器已经运行时添加属性、状态和转换。谢谢你。

0 投票
5 回答
13582 浏览

c++ - 如何让这个 Qt 状态机工作?

我有两个可以检查的小部件,以及一个应该包含大于零的值的数字输入字段。只要两个小部件都被选中,并且数字输入字段包含大于零的值,则应启用一个按钮。我正在努力为这种情况定义一个合适的状态机。到目前为止,我有以下内容:

这里的问题是以下转换:

使状态中的所有子状态registerButtonDisabled恢复到它们的初始状态。这是不受欢迎的行为,因为我希望aandb状态保持在同一状态。

我如何确保ab保持相同的状态?有没有另一种/更好的方法可以使用状态机解决这个问题?


注意。有无数种(可以说是更好的)方法来解决这个问题。但是,我只对使用状态机的解决方案感兴趣。我认为这样一个简单的用例应该可以使用简单的状态机来解决,对吧?

0 投票
1 回答
2554 浏览

qt - QStatemachine 和并行状态

我对带有 ParallelState 的 QStateMachine 快疯了。我有一个包含第一个状态的主状态(顺序),一个包含一组并行状态的第二个状态,以及另一个再次顺序的状态。第一个状态表示创建 N 个输入文件的进程,第二个表示在每个输入上工作的 N 个线程(一个文件一个线程),最后一个状态表示一个生成整个进程报告的进程(需要等待第二个状态已完全结束)。好吧,问题就在我需要在第二个状态和第三个状态之间创建一个障碍的时候。我需要一些障碍才能完成所有线程,但我无法做到。在文档之后,据说复合状态是并行的,当其所有子级进入最终状态时调用完成。首先,在这种情况下,进入最终状态是什么意思?我是否需要为并行状态中的每个状态创建最终状态?无论如何,我尝试这个但没有。结果是当第一个线程完成时,我的容器的最终状态被调用。

这是一个片段:

怎么能等到第二个状态完全结束呢?我也尝试使用 QObject::connect 与每个 pState 的完成信号,但它没有被调用。

谢谢,最好

0 投票
1 回答
918 浏览

qt - 如何检测忽略/拒绝发布到 QStateMachine 的 QEvent

我需要查看是否接受了状态机的自定义发布事件。我的方法是继承 QStateMachine。请参阅http://doc.qt.nokia.com/latest/statemachine-api.html部分事件、转换和警卫

我想知道下面的代码中是否没有遗漏什么。没有另一种/更好的方法吗?

基本上这里与 Qt Doc 相同:

到目前为止,我能找到的最简单的检测拒绝的方法是:

0 投票
4 回答
9687 浏览

c++ - C++ Qt:检查 QStateMachine 的当前状态

我正在尝试在 Qt (C++) 中实现状态机。如何检查 QStateMachine 的当前状态?我在文档中找不到方法。

谢谢

0 投票
1 回答
1267 浏览

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

我正在考虑使用QStateMachine. 但是,我不确定如何在状态之间发生转换时启动一些代码(例如show()a )。QWidget我可以用普通的旧信号很容易地做到这一点(见注释掉的代码),但我认为我可以在使用过渡切换屏幕时做一些花哨的动画。

这是我的代码:

编辑:根据 Koying 的建议更新。

应用程序窗口.h

应用程序窗口.cpp

加载游戏菜单.h:

加载游戏菜单.cpp:

主菜单.h:

主菜单.cpp:

主.cpp:

那么,当转换发生时如何触发一些行为或动作呢?

干杯。

0 投票
1 回答
2124 浏览

c++ - Qt QStateMachine 同步问题:初始状态未在启动信号上设置

所以我试图理解 Qt 的 QStateMachine 的一个问题,我希望有人能帮助解释为什么会发生这种情况。我对 QStateMachine 的基本理解非常感兴趣,而不仅仅是修复。

首先考虑具有状态 A、B 和事件 1 的状态机。事件 1 将您从 A 带到 B。A 是初始状态。

具体来说,这是为了维护邻居。在设备 XI 中收到邻居 Y 打招呼的消息。这会导致邻居 X 为这个新邻居 Y 分配一个邻居状态机。这会创建邻居状态机,然后调用 QStateMachine::start( ) ;

现在在这个状态机启动之后,我需要继续处理这个 hello 消息。所以起初我在做:

我的理解是这行不通,因为 start 是一个异步调用,因此状态机在启动完成后才处于初始启动状态。这引出了我的第一个问题。

1)所以状态机启动被放置在 qapp 事件队列中,但也没有发出异步调用?事件 1 不会在开始后被放入事件队列中,那么这不意味着我们将处于初始状态吗?还是发出不是异步调用?

认为这是问题,我通过将函数连接到状态机启动信号来稍微更改我的代码。然后,如果状态机未启动,我将代码更改为将事件排队,并在调用启动信号后处理此待处理事件队列(并将它们发送到状态机)。

事实证明,当我开始信号时,初始状态仍未设置。例如 QStateMachine::configuration( ).contains( initialstate ) == false。这引出了我的第二个也是更大的问题。

2)为什么发出started信号时我不在初始状态。

这里的事件顺序是:

  1. 创建状态机
  2. 设置初始状态
  3. 启动状态机
  4. 接收事件 1
  5. 由于未启动队列事件 1
  6. 已接收开始信号
  7. 处理事件 1
  8. 由于是未知状态什么都不做
  9. 接收事件 1
  10. 处理事件 1
  11. 现在处于状态 A。转换到状态 B。

顺序应该是:

  1. 创建状态机
  2. 设置初始状态
  3. 启动状态机
  4. 接收事件 1
  5. 由于未启动队列事件 1
  6. 已接收开始信号
  7. 处理事件 1
  8. 现在是状态 A。转换到状态 B。
  9. 接收事件 1
  10. 处理事件 1
  11. 现在是状态 B。什么也不做。

或者更好的活动我希望我不必排队参加活动。我希望我能做到这一点:

  1. 创建状态机
  2. 设置初始状态
  3. 启动状态机
  4. 接收事件 1
  5. 处理事件 1
  6. 现在是状态 A。转换到状态 B。
  7. 接收事件 1
  8. 处理事件 1
  9. 现在是状态 B。什么也不做。
0 投票
1 回答
2388 浏览

c++ - 无法启动状态和状态之间的转换:收到各种错误

我在使用Qt 状态机时遇到了一些问题。我永远无法执行状态:我遇到各种类型的错误,我无法弄清楚问题所在。有关错误和导致错误的代码的更多信息,请参阅下文。

这是我的主要功能:

我在 中设置了断点MyState,但断点永远不会被击中并且start/stop方法永远不会执行(我实际上只希望start被调用)。应用程序直接进入Finisher::OnFinished方法。

这是我的状态类:

Finisher 非常简单:

我尝试了几件事,包括直接设置每个状态的父级:

但是,当我似乎无法在machine.addState调用时添加状态时:

我也试过只离开构造函数而不调用machine.addState

但是,在这种情况下,我收到以下错误:

最后一个很奇怪,因为我明确声明了初始状态ms1,然后我调用start了,所以我不知道那里有什么问题。有人对如何让这个例子起作用有任何想法吗?

0 投票
1 回答
665 浏览

qt - QStateMachine 错误状态

我有具有三个状态 s1、s2、s3 和 s4 的状态机。从状态 s1、s2 和 s3 机器可以进入错误状态。

做这个的最好方式是什么?我在谷歌上搜索,但没有运气。可以做这样的事情吗?