LoginSignup
2
0

More than 1 year has passed since last update.

PyQt5のチュートリアルを動かす ④ Signals & Slots

Last updated at Posted at 2021-12-01

前回はQt Designerの使い方をご紹介しました。

今回はシグナルとスロットについてです。

Qt Designerを使ったSignal/Slotの記述

1.まず,Qt Designerを開きInput WidgetsLine EditButtonsPush Buttonを配置します。

Screenshot from 2021-12-01 19-06-32.png

2.Edit>Edit Signals/Slotsを選択し,PushButtonからLineEditを結ぶ

Screenshot from 2021-12-01 19-06-02.png

3.それぞれの機能を選択

今回はボタンを押したら,ラベルの文字が消える動作をさせます。
この場合,pushButtonはclicked()を,lineEditclear()を選択。

4..uiファイルを保存し,pythonコードに変換します。

pyuic5 -x signalslot.ui -o signalslot.py

生成されたコードには以下の用にsignalとslotの記述がされます。

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

Screenshot from 2021-12-01 19-06-17.png

プログラムで書くと?

デザイナーを使う代わりに直接記述する場合以下のように記載します。

widget.signal.connect(slot_function)

例えばボタンwidgetにシグナルを設定する場合はこのようになります。

button.clicked.connect(slot_function)

widgetが持っているシグナル要素?にconnectメソッドでよびだす関数を定義するようです。

signal/slotを使って,ボタンが押されたら,プリントするサンプルコードは以下のようになります。

buttons.py
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()

実行結果

Screenshot from 2021-12-01 19-26-37.png

最後に

部品間でsignal/slotを設定する場合はDesignerを使用したほうが簡単そうです。
slotを自分の好きな内容にする場合も空のsignal関数を設定できれば楽そうですが,Designerにあるのでしょうか?
今後そういった部分も知っていければなと思います。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0