2014-01-08 40 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的文檔)。因此,需要重構示例中的代碼,以便所有設置都在widget子類的__init__中進行。

下面是一個演示,做的是(爲了觸發自定義信號和狀態轉換,則必須在該行編輯,每當按鈕上的文字顯示「富」鍵入「富」):

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

相關問題