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