Pyqt-signals-and-slots
PyQt-シグナルとスロット
順次実行されるコンソールモードアプリケーションとは異なり、GUIベースのアプリケーションはイベント駆動型です。 関数またはメソッドは、ボタンをクリックする、コレクションからアイテムを選択する、またはマウスクリックなど、 events と呼ばれるユーザーのアクションに応答して実行されます。
GUIインターフェースの構築に使用されるウィジェットは、そのようなイベントのソースとして機能します。 QObjectクラスから派生した各PyQtウィジェットは、1つ以上のイベントに応じて「 signal 」を送信するように設計されています。 シグナル自体はアクションを実行しません。 代わりに、「スロット」に「接続」されています。 スロットには、任意の*呼び出し可能なPython関数*を指定できます。
PyQtでは、信号とスロットの接続はさまざまな方法で実現できます。 以下は、最も一般的に使用される技術です-
QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)
ウィジェットによって信号が発行されたときに、slot_functionを呼び出すより便利な方法は次のとおりです-
widget.signal.connect(slot_function)
ボタンがクリックされたときに関数が呼び出されると仮定します。 ここで、クリックされた信号は呼び出し可能な関数に接続されます。 それは、次の2つの技術のいずれかで達成することができます-
QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)
or
button.clicked.connect(slot_function)
例
次の例では、2つのQPushButtonオブジェクト(b1およびb2)がQDialogウィンドウに追加されます。 それぞれb1とb2をクリックすると、関数b1_clicked()とb2_clicked()を呼び出します。
b1がクリックされると、clicked()シグナルがb1_clicked()関数に接続されます
b1.clicked.connect(b1_clicked())
b2がクリックされると、clicked()シグナルがb2_clicked()関数に接続されます
QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)
例
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def window():
app = QApplication(sys.argv)
win = QDialog()
b1 = QPushButton(win)
b1.setText("Button1")
b1.move(50,20)
b1.clicked.connect(b1_clicked)
b2 = QPushButton(win)
b2.setText("Button2")
b2.move(50,50)
QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt")
win.show()
sys.exit(app.exec_())
def b1_clicked():
print "Button 1 clicked"
def b2_clicked():
print "Button 2 clicked"
if __name__ == '__main__':
window()
上記のコードは、次の出力を生成します-
出力
Button 1 clicked
Button 2 clicked