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

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

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

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

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

  • 任何指针都非常感谢!

    最佳答案

    好的。 Pyside.QtCore.Signal 是 Signals & Slots 衍生物。

    至于你的问题

  • 我想说在 QStateMachine 的上下文中 QEventSignal 没有区别(尽管 QEvent 和 Signals & Slots 是完全不同的概念)。根据您的需要,您可以使用 QEventSignal 触发转换。有关开箱即用的转换列表,请参见 QAbstactTransition :

  • 再次根据您的应用程序内部发生的情况,您的错误可能是来自 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 状态。

    关于python - QStateMachine:QEvent 和 Signal 的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19784875/

    10-13 08:33