2014-01-08 2 views
1

'пытается выяснить, как использовать собственные пользовательские сигналы в сочетании с QStateMachine. Я начал с простого примера с here. Теперь я пытаюсь создать новый сигнал mysignal и вызвать его переход. Но я не могу понять, как структурировать вызов addtransition, или как использовать синтаксис SIGNAL("clicked()") для ссылки на mysignal.как использовать пользовательский сигнал с QStateMachine addtransition

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_()) 

ответ

3

Произвольный сигнал должен быть определен как атрибут класса (см New-style Signal and Slot Support в документации PyQt). Таким образом, код в вашем примере должен быть реорганизован таким образом, чтобы все настройки выполнялись в __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_()) 
+0

Спасибо. У меня есть еще один вопрос, который, похоже, не стоит другой записи. Я попытался использовать 'assignProperty (self, 'doOnTick', self.doOnTick_foo)' где 'doOnTick' - метод, связанный с таймером. Моя цель состояла в том, чтобы функция запускалась каждый раз, когда таймер тикает, что делает что-то другое в зависимости от состояния конечного автомата. Я так и не смог заставить это работать. – gggg

+1

@gggg. Всегда лучше задавать новый вопрос, особенно когда речь идет о новой теме. Вопросы в комментариях не могут быть найдены путем поиска и ответов. Кроме того, в этом случае, я думаю, вам нужно показать примерный примерный код, так как это довольно сложно диагностировать проблему без него. – ekhumoro

 Смежные вопросы

  • Нет связанных вопросов^_^