前回はQt Designer
の使い方をご紹介しました。
今回はシグナルとスロットについてです。
Qt Designerを使ったSignal/Slotの記述
1.まず,Qt Designer
を開きInput Widgets
のLine Edit
とButtons
のPush Button
を配置します。
2.Edit
>Edit Signals/Slots
を選択し,PushButton
からLineEdit
を結ぶ
3.それぞれの機能を選択
今回はボタンを押したら,ラベルの文字が消える動作をさせます。
この場合,pushButtonはclicked()
を,lineEdit
はclear()
を選択。
4..ui
ファイルを保存し,pythonコードに変換します。
pyuic5 -x signalslot.ui -o signalslot.py
生成されたコードには以下の用にsignalとslotの記述がされます。
self.pushButton.clicked.connect(self.lineEdit.clear)
プログラムで書くと?
デザイナーを使う代わりに直接記述する場合以下のように記載します。
widget.signal.connect(slot_function)
例えばボタンwidgetにシグナルを設定する場合はこのようになります。
button.clicked.connect(slot_function)
widgetが持っているシグナル要素?にconnectメソッドでよびだす関数を定義するようです。
signal/slotを使って,ボタンが押されたら,プリントするサンプルコードは以下のようになります。
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()
実行結果
最後に
部品間でsignal/slotを設定する場合はDesignerを使用したほうが簡単そうです。
slotを自分の好きな内容にする場合も空のsignal関数を設定できれば楽そうですが,Designerにあるのでしょうか?
今後そういった部分も知っていければなと思います。
参考