3

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

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

应用状态模型

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

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

尤其:

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

非常感谢任何指针!

4

1 回答 1

4

行。Pyside.QtCore.Signal是 Signals & Slots 衍生产品。

至于你的问题

  1. 我想说QStateMachineQEvent和上下文没有区别(尽管Signals & Slots 是完全不同的概念)。根据您的需要,您可以使用或触发转换。请参阅开箱即用的转换列表:SignalQEventQEventSignalQAbstactTransition

    继承者:QSignalTransition、QEventTransition、QMouseEventTransition、QKeyEventTransition

  2. 再次取决于您的应用程序内部发生的情况,您的错误可能来自信号QObject或者您可以发送(发布) custom QEvent。您需要实现您的自定义QEvent和/或自定义以仅在您的事件QEventTransition上触发转换。

  3. 再次取决于:) 过渡是胶水。它具有关于源和目标状态的知识。所以我只把准备代码放在里面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
    

    但正如你所见,它运作良好。

NB:如果你有 iOS 经验,那么UIStoryboardSegue过渡是模拟的。主要用于在 IE 状态之间传递UIView数据

于 2013-11-09T21:04:09.947 回答