2

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

1 に答える 1

3

カスタム シグナルはクラス属性として定義する必要があります ( 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_())
于 2014-01-08T04:06:37.193 に答える