gpt4 book ai didi

python - 如何通过 QStateMachine addtransition 使用自定义信号

转载 作者:行者123 更新时间:2023-11-30 23:29:44 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何将我自己的自定义信号与 QStateMachine 结合使用。我从 here 中的一个简单示例开始。现在我正在尝试创建一个新信号 mysignal 并触发它的转换。但我不知道如何构造对 addtransition 的调用,或者如何使用 SIGNAL("clicked()") 语法来引用 mysignal .

from PyQt4.QtGui import *
from PyQt4.QtCore import *

if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
button = QPushButton()
machine = QStateMachine()

off = QState()
off.assignProperty(button, 'text', 'Off')
off.setObjectName('off')

on = QState()
on.setObjectName('on')
on.assignProperty(button, 'text', 'On')

mysignal = pyqtSignal()

off.addTransition(mysignal, on)
# Let's use the new style signals just for the kicks.
on.addTransition(button.clicked, off)

machine.addState(off)
machine.addState(on)
machine.setInitialState(off)
machine.start()
mysignal.emit()
button.resize(100, 50)
button.show()
sys.exit(app.exec_())

最佳答案

自定义信号必须定义为类属性(请参阅 PyQt 文档中的 New-style Signal and Slot Support)。因此,需要重构示例中的代码,以便所有设置都发生在小部件子类的 __init__ 中。

下面是执行此操作的演示(为了触发自定义信号及其状态转换,只要按钮文本显示“Foo”,您就必须在行编辑中键入“foo”):

from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
customSignal = QtCore.pyqtSignal()

def __init__(self):
QtGui.QWidget.__init__(self)
self.edit = QtGui.QLineEdit(self)
self.edit.textChanged.connect(self.handleTextChanged)
self.button = QtGui.QPushButton(self)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.edit)
layout.addWidget(self.button)
self.machine = QtCore.QStateMachine()
self.off = QtCore.QState()
self.off.assignProperty(self.button, 'text', 'Off')
self.on = QtCore.QState()
self.on.assignProperty(self.button, 'text', 'On')
self.foo = QtCore.QState()
self.foo.assignProperty(self.button, 'text', 'Foo')
self.off.addTransition(self.button.clicked, self.on)
self.on.addTransition(self.button.clicked, self.foo)
self.foo.addTransition(self.customSignal, self.off)
self.machine.addState(self.off)
self.machine.addState(self.on)
self.machine.addState(self.foo)
self.machine.setInitialState(self.off)
self.machine.start()

def handleTextChanged(self, text):
if text == 'foo':
self.edit.clear()
self.customSignal.emit()

if __name__ == '__main__':

import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
window.setGeometry(500, 300, 100, 100)
sys.exit(app.exec_())

关于python - 如何通过 QStateMachine addtransition 使用自定义信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20985208/

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