【问题标题】: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 令人满意地应用于我的问题!

特别是:

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

非常感谢任何指针!

【问题讨论】:

标签: python qt pyside qstatemachine


【解决方案1】:

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

至于你的问题

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

    继承者:QSignalTransition、QEventTransition、 QMouseEventTransition, QKeyEventTransition

  2. 再次根据应用程序内部发生的情况,您的错误可能是来自QObject 的信号,或者您可以发送(发布)自定义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
    

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

注意:如果您有 iOS 经验,那么 UIStoryboardSegue 是过渡的模拟。主要用于在UIView's之间传递数据,即UI状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    • 2012-08-12
    相关资源
    最近更新 更多