问题标签 [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.
qt - QStateMachine 自动转换或混合 boost::msm 与 QObject
我对 C++ 和 Qt 很陌生,我想开发一种机器控制并通过状态机对过程进行建模。到目前为止,我将我的代码分成不同的 QObjects,这些 QObjects 在不同的 QThreads 中运行,它们通过 QTs 信号/插槽概念进行通信。到目前为止,我一直在使用 QStatemachine 框架,但我怀疑我是否以正确的方式使用它。例如,我创建了一个简单的 StateMachine:
*。H:
*.cpp:
在这种情况下,我必须为我的 FSM 中的每个转换声明一个信号,并为每个状态声明一个插槽,并相应地连接它们。这在像上面这样的小例子中可能没问题,但如果 FSM 可能包含超过 100 个状态,则会很快变得混乱。
- 有没有办法使用无条件转换?例如
sA->addTransition(sB)
,这意味着 sA 将自动转换为 sB。但是,如果我尝试使用它,它会破坏我的 QStateMachine。如果这是不可能的: - 我对 Boost MSM 框架进行了一些研究,并且喜欢提供的语法和功能(转换表、“无”事件等)。是否有适当的方法将 boost::msm 嵌入 QObject 并能够在
on_entry
boost::msm 的函数中发出该 QObject 的信号?
python - QSignalTransition 子类从未收到自定义 PyQt 信号
尝试使用从为 PySide 编写的这个示例QStateMachine
派生的转换来学习 PyQt5。要使用 PyQt,我只是更改了信号的定义,以及它在初始化程序中的引用方式。这是完整的代码:QSignalTransition
QSignalTransition
这个状态机只计算 6 的阶乘并打印它。
我的问题是,在这两种转换中,这段代码:
False
在第一次也是唯一一次调用时返回。我认为这是因为传递的事件类型不正确,并且超类返回False
. 有了这种行为,转换永远不会执行,状态机保持在其初始状态。
有人可以解释是什么问题吗?我从 PySide 到 PyQt 的转换是错误的吗?
qt - 具有动态转换的 QStateMachine
我有一个应用程序,其中 UI 由 a 驱动,QStateMachine
并且某些状态可以描述为“不可中断”:一旦进入,用户必须与 UI 交互,完成后可以退出状态,但是过渡可能取决于外部事件。
以下是我将如何说明问题:
然后是一些过渡:
现在应用程序启动状态机并进入 A :
1 - 用户单击触发QSignalTransition
(event1) 的 UI。
2 - 在 B 中,远程服务器向应用程序发送一些东西,这应该定义我们是输入 C (event2) 还是 D (event3),但只有在 B 正确退出之后。
问题在于,如果我们静态定义转换(在状态机启动之前),那么当发送 event2 或 event3 时,转换可能会导致 B 被中断(例如,假设用户尚未完成选择某事)
一旦我们知道我们需要哪个状态,是否可以动态更改两种状态之间的转换?
希望描述清楚。
谢谢你。
python - 不支持 C++ 类型作为 pyqtSignal() 类型参数类型
我正在尝试在我的 GUI 中实现状态机(使用 python3.8 和 Qt5(使用 PyQt5 而不是 PySides!))。我遇到的问题是在添加基于事件的转换时。
使用下面的代码,解释器在第 26 行抱怨:
我之前用谷歌搜索并阅读了stackoverflow,但所有答案都是针对Qt4
或正在使用的PySides
。Qt5
和之间有很多变化Qt4
。并且PySides
has ,我在isPySides.QtCore.SIGNAL
中找到了等价物,但似乎无法正常工作。PyQt5
PyQt5.QtCore.pyqtSignal
qt - QState:单击 QPushbutton 时更改操作
在阅读了有限状态机之后,我在 QT 中找到了 QState/QStateMachine API。
但是现在我不知道如何使用它来根据我当前所处的状态运行不同的代码。
让我们看下面的例子:
我必须在此代码中添加什么才能button1.clicked
连接到action_a
when in state_a
,但连接到action_b
when in state_b
?
python - QStateMachine 过程转换(即信号)
我需要能够从不是由用户交互(即通过进程完成)生成的信号(或等效的东西)更改 QStateMachine 的状态。此示例重定向用户生成的信号以演示该想法,但尚未起作用。在这里,按钮信号会触发我想用于转换的其他信号。这里的状态B1 <-> B2
是按下Bi -> Bj
按钮时重定向信号的位置bi
。
QStateMachine 文档似乎只涵盖了基于按钮直接信号的转换,我无法推断出使用任何信号的更一般情况(即我创建的信号)。
python - 有没有办法通过 QStateMachine QState 转换传递信号参数?
例如,假设我有一个QButtonBucket
包含一些数字N QPushButton
的类,并且我想按下这些按钮中的任何一个来导致从某个状态到另一个状态的转换。这很简单:
但是,假设我想对QPushButton
导致转换的源做一些事情,例如如果转换是 from to 则更改其颜色state_1
,或者如果转换是 from back tostate_2
则可能禁用它state_3
state_1
QStateMachine
由于 s 的异步性质,我想在逻辑的严格范围内处理这个问题QStateMachine
。我不想在QButtonBucket
.
如果有一种方法可以获取与 中标识的信号一起传递的参数addTransition
,并在进入新状态后对它们进行操作,那将非常完美。但我没有看到一个简单的解决方案来实现它。
有没有一种已知的好方法来实现我想要完成的目标?
qt - 如何在 qt 状态机中使用 QHistoryState 来识别发生转换的最后一个状态
我对 qt 状态机很陌生。我有一个简单的要求——
- 我从两个不同的状态(比如 S1 和 S2)转换到相同的状态(比如 S3),当我进入 S3 并调用插槽时(比如 S3Entered())。
- 现在根据初始状态(S1 或 S2)我需要做一些不同的事情。
我想使用 QHistoryState 但在 qt 文档中没有足够的示例可以这样做,
如果您有任何其他方法,请告诉我。
qt - 如何在 Qt 的状态机中实现选择?
想象一下你的状态机的一部分看起来像这样:
您如何正确实现 Qt 中的选择部分?我知道有保护转换,但这意味着我需要:
- 创建一个QAbstractTransition的子类,它接受例如一个
std::function<bool()>
和一个标志,该标志确定当该布尔结果为真或为假时是否发生转换 - 使用相同的布尔函数创建此类的两个实例,但转换保护相反
S1
使用这两个实例添加两个转换。
对于像选择这样简单的事情,这种方法似乎有点笨拙且容易出错。是否有更可维护的方法来实现这一点?
c++ - QStateMachine 在释放模式下没有发出started() 信号
我正在为设备控制器类使用 QStateMachine 框架。它在调试模式下工作正常。但是,在发布模式下,不会发出 QStateMachine::started() 信号。下面是一个针对该问题的简单小部件项目(表单为空)。
Qt 版本 5.14.1
编译器:MSVC 2017,MinGW(均为 64 位,结果相同)
测试.pro
主文件
主窗口.h
主窗口.cpp
调试模式下的应用程序输出(几秒钟后我关闭了表单。)
发布模式下的应用程序输出(几秒钟后我关闭了表单。)