代码之家  ›  专栏  ›  技术社区  ›  mins

QSignalTransition子类从未接收到自定义PyQt信号

  •  0
  • mins  · 技术社区  · 6 年前

    尝试学习PyQt5 QStateMachine QSignalTransition 下列的 this example Q信号转换

    from PyQt5.QtCore import QObject, pyqtSignal, QSignalTransition, QCoreApplication, QStateMachine, QState, QFinalState
    
    
    class Factorial(QObject):
        xChanged = pyqtSignal(int)
        def __init__(self):
            super(Factorial, self).__init__()
            self.xval = -1
            self.facval = 1
        def getX(self):
            return self.xval
        def setX(self, x):
            if self.xval == x:
                return
            self.xval = x
            self.xChanged.emit(x)
        x = property(int, getX, setX)
        def getFact(self):
            return self.facval
        def setFact(self, fac):
            self.facval = fac
        fac = property(int, getFact, setFact)
    
    class FactorialLoopTransition(QSignalTransition):
        def __init__(self, fact):
            super(FactorialLoopTransition, self).__init__(fact.xChanged[int])
            self.fact = fact
        def eventTest(self, e):
            if not super(FactorialLoopTransition, self).eventTest(e):
                return False
            return e.arguments()[0] > 1
        def onTransition(self, e):
            x = e.arguments()[0]
            fac = self.fact.fac
            self.fact.fac = x * fac
            self.fact.x = x - 1
    
    class FactorialDoneTransition(QSignalTransition):
        def __init__(self, fact):
            super(FactorialDoneTransition, self).__init__(fact.xChanged[int])
            self.fact = fact
        def eventTest(self, e):
            if not super(FactorialDoneTransition, self).eventTest(e):
                return False
            return e.arguments()[0] <= 1
        def onTransition(self, e):
            print(self.fact.fac)
    
    if __name__ == '__main__':
        import sys
        app = QCoreApplication(sys.argv)
        factorial = Factorial()
        machine = QStateMachine()
    
        compute = QState(machine)
        compute.assignProperty(factorial, 'fac', 1)
        compute.assignProperty(factorial, 'x', 6)
        compute.addTransition(FactorialLoopTransition(factorial))
    
        done = QFinalState(machine)
        doneTransition = FactorialDoneTransition(factorial)
        doneTransition.setTargetState(done)
        compute.addTransition(doneTransition)
    
        machine.setInitialState(compute)
        machine.finished.connect(app.quit)
        machine.start()
        sys.exit(app.exec_())
    

    这个状态机只计算6的阶乘并打印出来。

    我的问题是,在两个转换中,这段代码:

    def eventTest(self, e):
        if not super(FactorialDoneTransition, self).eventTest(e):
            return False
        return e.arguments()[0] <= 1
    

    退货 False . 使用这种行为,转换永远不会执行,状态机将保持在初始状态。

    有人能解释一下是什么问题吗?是我从PySide到PyQt的转换是错误的吗?

    0 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc Yonghwan Shin    6 年前

    这个 assignProperty() pyqtProperty ,这就是错误的原因,因此解决方案是替换为以下内容:

    from PyQt5.QtCore import QObject, pyqtSignal, QSignalTransition, QCoreApplication, QStateMachine, QState, QFinalState, pyqtProperty
    
    
    class Factorial(QObject):
        xChanged = pyqtSignal(int)
        def __init__(self):
            super(Factorial, self).__init__()
            self.xval = -1
            self.facval = 1
    
        def getX(self):
            return self.xval
    
        def setX(self, x):
            if self.xval == x:
                return
            self.xval = x
            self.xChanged.emit(x)
    
        x = pyqtProperty(int, getX, setX) # <---
    
        def getFact(self):
            return self.facval
    
        def setFact(self, fac):
            self.facval = fac
    
        fac = pyqtProperty(int, getFact, setFact) # <---
    
    # ...
    
    推荐文章