【问题标题】:QStateMachine: Difference between QEvent and Signal?QStateMachine:QEvent 和 Signal 之间的区别?
【发布时间】:2015-12-29 00:35:27
【问题描述】:
我目前正在将 small application 从 PyGTK 移植到 PySide,它位于您的系统托盘中,并定期检查服务器是否有更新。
当我最初写这篇文章时,我使用了一个自定义状态模型来表示它的行为:
- init:初始状态
- 检查:检查服务器是否有更新
- 断开连接:没有连接到服务器(等待一段时间再试)
- 错误:服务器报告错误(用户需要在继续之前检查设置)
- 空闲:等待 POLLING INTERVAL 秒,然后再次检查
- 退出
我后来发现 Qt 有 QStateMachine,它似乎非常适合这种类型的结构。但是,我无法将examples 令人满意地应用于我的问题!
特别是:
- 在 QStateMachine 的上下文中,Signal 和 QEvent 有什么区别?
- 如何定义条件转换,即出错时转到...?
- 程序逻辑应该发生在 Transition.onTransition() 还是 QState.onEnter() 中?
非常感谢任何指针!
【问题讨论】:
标签:
python
qt
pyside
qstatemachine
【解决方案1】:
好的。 Pyside.QtCore.Signal 是 Signals & Slots 的衍生产品。
至于你的问题
-
我想说在 QStateMachine 的上下文中 QEvent 和 Signal 没有区别(尽管 QEvent 和 Signals & Slots 是完全不同的概念)。根据您的需要,您可以使用QEvent 或Signal 触发转换。请参阅QAbstactTransition 了解开箱即用的转换列表:
继承者:QSignalTransition、QEventTransition、
QMouseEventTransition, QKeyEventTransition
再次根据应用程序内部发生的情况,您的错误可能是来自QObject 的信号,或者您可以发送(发布)自定义QEvent。您需要实现自定义 QEvent 和/或自定义 QEventTransition 以仅在您的事件上触发转换。
-
这又取决于:) 过渡是粘合剂。它具有关于源和目标状态的知识。所以我只会在onTransition() 中放入准备代码,在onEnter() 中放入状态初始化代码。此外,我将更改状态的代码放在onTransition() 中似乎是错误的,就像您展示的示例一样:
def onTransition(self, e):
x = e.arguments()[0]
fac = self.fact.fac
self.fact.fac = x * fac
self.fact.x = x - 1
但正如您所见,它运作良好。
注意:如果您有 iOS 经验,那么 UIStoryboardSegue 是过渡的模拟。主要用于在UIView's之间传递数据,即UI状态。