【问题标题】:how to use a custom signal with QStateMachine addtransition如何在 QStateMachine addtransition 中使用自定义信号
【发布时间】:2014-01-08 01:08:19
【问题描述】:

正在尝试弄清楚如何将我自己的自定义信号与 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_())

【问题讨论】:

    标签: python qt4 pyqt4 qstatemachine


    【解决方案1】:

    必须将自定义信号定义为类属性(请参阅 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_())
    

    【讨论】:

    • 谢谢。我还有一个问题似乎不值得再次输入。我尝试使用assignProperty(self, 'doOnTick',self.doOnTick_foo),其中doOnTick 是连接到计时器的方法。我的目标是在每次计时器滴答时运行一个函数,根据状态机的状态执行不同的操作。我也无法让它发挥作用。
    • @gggg。发布一个新问题总是最好的,尤其是当它涉及一个新主题时。 cmets中的问题搜不到,也找不到任何回复。另外,在这种情况下,我认为您需要展示一些可测试的示例代码,因为没有它很难诊断问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多