PyQt-シグナルとスロット

順次実行されるコンソールモードアプリケーションとは異なり、GUIベースのアプリケーションはイベント駆動型です。関数またはメソッドは、ボタンのクリック、コレクションからのアイテムの選択、マウスのクリックなどのユーザーのアクションに応答して実行されます。events

GUIインターフェースの構築に使用されるウィジェットは、そのようなイベントのソースとして機能します。QObjectクラスから派生した各PyQtウィジェットは、 'を発行するように設計されています。signal'1つ以上のイベントに応答します。信号自体は何のアクションも実行しません。代わりに、「に接続されている」slot'。スロットはどのようなものでもかまいませんcallable Python function

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)

または

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