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