gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:12:37 25 4
gpt4 key购买 nike

尝试使用从 this example 之后的 QSignalTransition 派生的转换来学习 PyQt5 QStateMachine为 PySide 编写。为了使用 PyQt,我只是更改了信号的定义以及在 QSignalTransition 初始化程序中引用它的方式。这是完整的代码:

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。我认为这是因为传递的事件类型不正确,并且父类(super class)返回 False。通过这种行为,转换永远不会执行,并且状态机保持其初始状态。

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

最佳答案

assignProperty()方法需要一个 Q_PROPERTY,在 PySide/PySide2 的情况下等于 Property(这与 python native 提供的属性不同),在 PyQt4/PyQt5 的情况下,您必须使用 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) # <---

# ...

关于python - QSignalTransition 子类从未收到自定义 PyQt 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55144943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com