Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QStateMachine:QEvent和Signal之间的差异?_Python_Qt_Pyside_Qstatemachine - Fatal编程技术网

Python QStateMachine:QEvent和Signal之间的差异?

Python QStateMachine:QEvent和Signal之间的差异?,python,qt,pyside,qstatemachine,Python,Qt,Pyside,Qstatemachine,我目前正在将一个从PyGTK移植到PySide,它位于您的systray中,并定期检查服务器的更新 当我最初写这篇文章时,我使用自定义状态模型来表示其行为: 初始状态 检查:检查服务器是否有更新 已断开连接:与服务器没有连接(请等待一段时间重试) 错误:服务器报告错误(用户需要在继续之前检查设置) 空闲:等待轮询间隔秒,然后再次检查 退出 后来我发现Qt有QStateMachine,它似乎非常适合这种类型的结构。然而,我没能满意地将这些应用到我的问题上 特别是: 在QStateMachin

我目前正在将一个从PyGTK移植到PySide,它位于您的systray中,并定期检查服务器的更新

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

  • 初始状态
  • 检查:检查服务器是否有更新
  • 已断开连接:与服务器没有连接(请等待一段时间重试)
  • 错误:服务器报告错误(用户需要在继续之前检查设置)
  • 空闲:等待轮询间隔秒,然后再次检查
  • 退出
后来我发现Qt有QStateMachine,它似乎非常适合这种类型的结构。然而,我没能满意地将这些应用到我的问题上

特别是:

  • 在QStateMachine的上下文中,信号和QEvent之间的区别是什么
  • 如何定义条件转换,即出错时转到
  • 程序逻辑应该发生在Transition.onTransition()还是QState.oneter()中
    非常感谢任何指点

    好的
    Pyside.QtCore.Signal
    是信号和插槽的派生

    至于你的问题

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

    继承人:QSignalTransition、QEventTransition、, QMouseEventTransition,QKeyEventTransition

  • 同样,根据应用程序内部发生的情况,您的错误可能是来自
    QObject
    的信号,也可能是您可以发送(post)自定义的信号。您需要实现自定义
    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
    
    但正如你所看到的,它工作得很好


  • NB:如果您有iOS经验,则可以模拟过渡。主要用于在UI状态之间传递数据。

    您在说什么信号:或者?@twi:我在说Pyside.QtCore.Signal(如中所用)