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

c++ - 布局中的 Qt 状态机转换

好吧,我正在开发一个 Qt 应用程序,我想使用 Qt State Framework 来制作一些动画。

第一: 如何通过使用状态转换将水平布局中包含的一组按钮动画化为另一个垂直布局?

第二: 如何在状态下显示小部件?例如一个菜单:当用户点击菜单中的一个按钮时,小部件(之前已经被 widget->hide() 隐藏)被显示...???

这是一个代码示例:

0 投票
0 回答
222 浏览

qt - 在两个 QState 之间添加我自己的动画

我有一个类可以成功地为QGraphicsItem设置动画。

我想更改可以添加两个称为 s1 和 s2 的QState的类,当QGraphicsItem不移动时,其状态为 s1。虽然它将状态更改为 s2,但它应该在我定义的动画类上移动。最后,它必须将其状态更改为 s2。我试图通过下面的代码来实现这一点,但它不起作用。你能解释一下为什么吗?

谢谢。

0 投票
1 回答
476 浏览

qt - 触发信号的QStatemachine:未调用连接的插槽

我想编写一个函数来显示我的 GUI 的基本流程,例如,如果我在插槽中调用该函数,它会以 FileMenu->Open(触发信号并启用与其连接的插槽)等状态开始转换。我尝试使用状态机:

文件菜单未出现在该位置。此外,信号不会在状态转换时触发。我是新手QStateMachine。我不确定以这种方式触发信号是否可行。如果是,那么我的代码有什么问题,或者有没有更好的方法来做到这一点?


编辑:文件菜单更正:

0 投票
1 回答
3894 浏览

c++ - 如何实现 QStateMachine 状态转换动作?QSignalMapper?

我正在构建一个具有大部分顺序流程但也有一些替代路径的程序。我认为状态机可能是实现这一点的最简单方法,因为 Qt 提供了这样一个类:QStateMachine(另见API)。

但是,我似乎有很多州(20+)。另外,我有许多不同的转换事件(比如说按钮 1-10)。因此,例如按下按钮 x 将导致状态 13 到 14 的转换。

进入或离开每个状态应该能够执行带有参数的特定功能,而每个状态都发出这样的信号,但不可能传递参数,因此它需要潜在的大量无参数功能。

对于这个问题,重新实现QAbstractState似乎也很乏味,除非它有类似于assignProperty()允许QObject在“状态条目”上设置属性的方法。

QSignalMapper每个状态的转换信号加上几个 Signal-Slot-Connections 来处理多个动作是一种合适的方法吗?

0 投票
2 回答
1242 浏览

c++ - QStateMachine 从虚拟状态立即转换

为了根据转换设置对象属性,我需要两个立即进一步转换的中间状态:

(或者,可以复制 B 以直接设置每个相应的属性。)

一个状态的输入()信号可以用作它自己的转换源吗?

0 投票
1 回答
277 浏览

c++ - QStateMachine timing (showing a non-blocking dialog via QState entered() signal)

When entering a QState in QStateMachine a few Widget object properties are set with assignProperty() and the entered() Signal is used to run a Slot method that exec()s a QDialog.

This principally works, but the dialog is created before the properties are assigned, which is not desired, as the properties are only eventally assigned after the dialog is closed.

The exact order were not critical if the dialog would not block (what exactly does it "block"?). The human-perceived appearance should be "simultaneous".

A solution would make the dialog non-blocking or ensure the properties are set prior to the dialog's execution.

I will now try to use a single-shot QTimer to delay the slot that runs the QDialog's exec() but of course I am still looking for a proper solution even if this should work.

0 投票
1 回答
889 浏览

python - QStateMachine:QEvent 和 Signal 之间的区别?

我目前正在将一个小型应用程序从 PyGTK 移植到 PySide,它位于您的系统托盘中,并定期检查服务器是否有更新。

当我最初写这篇文章时,我使用了一个自定义状态模型来表示它的行为:

应用状态模型

  • init:初始状态
  • 检查:检查服务器是否有更新
  • 断开连接:没有连接到服务器(等待一段时间再试一次)
  • 错误:服务器报告错误(用户需要在继续之前检查设置)
  • idle:等待 POLLING INTERVAL 秒,然后再次检查
  • 辞职

我后来发现 Qt 有 QStateMachine,它似乎非常适合这种类型的结构。但是,我无法将这些示例令人满意地应用于我的问题!

尤其:

  1. 在 QStateMachine 的上下文中,Signal 和 QEvent 有什么区别?
  2. 如何定义条件转换,即出错时转到...?
  3. 程序逻辑应该发生在 Transition.onTransition() 还是 QState.onEnter() 中?

非常感谢任何指针!

0 投票
0 回答
1417 浏览

c++ - 带有 QSignalTransition 的 QStateMachine 丢失信号

我对 QStateMachine 有一个奇怪的问题,我一个星期都无法解决。

简要说明:

我在我的应用程序中使用 QStateMachine 来控制向通过 COM 端口连接的生物医学设备发送命令。整个状态机很复杂,有数百个状态和频繁的子状态。

机器是根据用户的偏好从设备的通信协议生成的。例如,如果用户想从设备中获得一些“反应”,则该反应由几个子反应组成,这些子反应由基本步骤(设备指令)组成。应用程序从这些基本步骤构建整个反应并在状态机上启动它。

因此,我创建了类CompositeReactionControl(继承自 QState),它允许从特定子状态构建复合。

QSignalTransition 实例用于将状态连接在一起。

问题描述:

有时,当发出前一个状态的 finish() 信号时,机器不会从一种状态转换到另一种状态。

笔记:

  1. 我 100% 确定该状态已连接。
  2. 我 100% 确定该信号已被触发。
  3. 通过机器的事件及其状态在与应用程序的其余部分不同的线程中运行,这个特定的信号被触发并在相同的线程中捕获
  4. 它在所有反应中随机发生(没有与此问题相关的特定反应或子状态)
  5. 在一次运行(反应)中引起问题的子状态,在相同反应的其他运行中运行没有任何问题
  6. StateMachine 长时间运行时会发生这种情况,它不会出现在第 4 反应之前(无论用户选择哪种反应)。

代码

有问题的部分在以下代码中标有注释“这是问题”...

向 CompositeReactionControl 添加新的子状态:

传递过渡:

来自好案例的日志

在这种情况下,一切正常。重要的是 PassTransition::EventTest 接收到 192 类型的事件,这是从先前状态的 finished() 信号创建的状态机事件。

不良案例的日志

可以看出,如果错误随机发生,则方法 PassTransition::EventTest 不会接收到提到的事件。5 秒超时后(我尝试了更长的时间间隔),我停止状态机并打印错误。

0 投票
1 回答
1845 浏览

python - 如何在 QStateMachine addtransition 中使用自定义信号

我试图弄清楚如何将我自己的自定义信号与 QStateMachine 结合使用。我从这里的一个简单示例开始。现在我正在尝试创建一个新信号mysignal并触发它的转换。但我不知道如何构造对 的调用addtransition,或者如何使用SIGNAL("clicked()")语法来引用mysignal.

0 投票
2 回答
2357 浏览

qt - 如何测试 QStateMachine?

我对如何测试 QStateMachine 有点困惑。我有一个项目组织良好,一侧是源代码,另一侧是测试代码。

标题

并且在源文件中

我想知道是否有一种很好的方法来测试我的 stateMachine 是否正确。换句话说,如果我在那里发出 sigGoToStateThree() ,我的状态机将如何反应,等等。

我看到的解决方案: 1 - 获取 stateMachine 的地址(以及最终所有其他状态)并测试它(但我不知道如何) 2 - 从测试文件模拟信号(sigGoToStateX())(同样,不知道如果可以在其他类中发出我的类 Foo 的信号)

我的独特需求是我不想修改源文件的核心。

提前致谢。