我目前正在将small application从PyGTK移植到位于系统托盘中的PySide上,并定期检查服务器是否有更新.
最初编写此代码时,我使用自定义状态模型来表示其行为:
> init:初始状态
>检查:检查服务器是否有更新
>断开连接:没有连接到服务器(等待一段时间再试一次)
>错误:服务器报告了错误(用户需要检查设置才能继续)
>空闲:等待POLLING INTERVAL秒,然后再次检查
>退出
从那以后,我发现Qt具有QStateMachine,它对于这种类型的结构似乎很完美.但是,我无法令人满意地将examples应用于我的问题!
尤其是:
>在QStateMachine的上下文中,Signal和QEvent有什么区别?
>如何定义条件转换,即发生错误时转到…?
>程序逻辑是否应该在Transition.onTransition()或QState.onEnter()中发生?
非常感谢任何指针!
解决方法:
好. Pyside.QtCore.Signal是Signals&插槽导数.
至于你的问题
>我要说的是,在QStateMachine的上下文中,QEvent和Signal并没有区别(尽管QEvent和Signals& Slot是完全不同的概念).根据您的需要,您可以使用QEvent或Signal触发转换.开箱即用的转换列表,请参见QAbstactTransition
:
Inherited by: 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状态)之间传递数据.