QStateMachine:QEvent和Signal之间的区别?

时间:2013-11-05 08:48:59

标签: python qt pyside qstatemachine

我目前正在将一个small application从PyGTK移植到PySide,它位于你的系统中,并定期检查服务器是否有更新。

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

Application state model

  • init:初始状态
  • 检查:检查服务器是否有更新
  • 已断开连接:没有与服务器的连接(等待一段时间再试一次)
  • 错误:服务器报告错误(用户需要在继续之前检查设置)
  • 空闲:在再次检查之前等待POLLING INTERVAL秒
  • 退出

我发现Qt有QStateMachine,这对于这种类型的结构来说似乎很完美。但是,我无法将examples令人满意地应用于我的问题!

特别是:

  1. 在QStateMachine的上下文中,Signal和QEvent有什么区别?
  2. 如何定义条件转换,即错误转到......?
  3. 程序逻辑应该在Transition.onTransition()还是在QState.onEnter()中发生?
  4. 任何指针都非常受欢迎!

1 个答案:

答案 0 :(得分:4)

确定。 Pyside.QtCore.Signal是信号&插槽导数。

关于你的问题

  1. 我说QStateMachine的上下文中QEventSignal没有区别(尽管QEvent和信号与插槽完全不同概念)。根据您的需要,您可以使用QEventSignal触发转换。有关即用型过渡列表,请参阅QAbstactTransition

      

    继承者:QSignalTransition,QEventTransition,   QMouseEventTransition,QKeyEventTransition

  2. 再次根据应用程序内部发生的情况,您的错误可能来自QObject,也可以发送(发布)自定义QEvent。您需要实施自定义QEvent和/或自定义QEventTransition才能触发 事件的转换。

  3. 再次依赖:) Transition是胶水。它具有源和目标状态的知识。因此,我只在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
    

    但是你可以看到效果很好。

  4. NB:如果您有iOS体验,则UIStoryboardSegue类似于转换。主要用于在UIView's即UI状态之间传递数据。