PyQt5-シグナルとスロット

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

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

QtDesignerのシグナル/スロットエディターの使用

まず、LineEditコントロールとPushButtonを使用して単純なフォームを設計します。

ボタンを押すと、テキストボックスの内容が消去されることが望まれます。QLineEditウィジェットには、この目的のためのclear()メソッドがあります。したがって、ボタンのclicked 信号はに接続されます clear() テキストボックスのメソッド。

まず、[編集]メニューから[信号/スロットの編集]を選択します(またはF4キーを押します)。次に、マウスでボタンを強調表示し、カーソルをテキストボックスに向かってドラッグします

マウスを離すと、ボタンの信号とスロットの方法を示すダイアログが表示されます。クリックされたシグナルとclear()メソッドを選択します

右下のSignal / SlotEditorウィンドウに結果が表示されます-

以下のコードに示すように、uiファイルからuiとビルドおよびPythonコードを保存します-

pyuic5 -x signalslot.ui -o signalslot.py

生成されたPythonコードは、次のステートメントによってシグナルとスロットを接続します-

self.pushButton.clicked.connect(self.lineEdit.clear)

signallot.pyを実行し、LineEditにテキストを入力します。ボタンを押すとテキストがクリアされます。

信号スロット接続の構築

Designerを使用する代わりに、次の構文を使用して信号スロット接続を直接確立できます-

widget.signal.connect(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()関数に接続されます。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets 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)
   b2.clicked.connect(b2_clicked)
   
   win.setGeometry(100,100,200,100)

   win.setWindowTitle("PyQt5")
   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