ラズパイデスクトップでPyQt5入門(8) Event and Signal in PyQt5(1)
こんばんは。國松です。
今回はPyQt5のアプリケーションで発生するイベントとシグナルについて見ていきたいと思います。
参考サイト
ZetCode PyQt5 tutorial
【PythonでGUI】PyQt5 -始めの一歩-
Event and Signal in PyQt5
Event
GUIアプリケーションはイベント駆動型です。イベントは主にアプリケーションのユーザーによって生成されます。イベントはインターネット接続、ウィンドウマネージャー、タイマーなどによっても生成されます。
アプリケーションのexec_()メソッドを呼び出すとアプリケーションはメインループに入ります。メインループはイベントを取得しそれらをオブジェクトに送信します。
イベントには3つの要素があります。
event source 状態が変化するオブジェクトでイベントを生成します。
event object イベントソース内の後退変化をカプセル化したものです。
event target 通知するオブジェクトです。
イベントオブジェクトはイベント処理をするタスクをイベントターゲットに委任します。
PyQt5はイベントを処理するための独自のシグナルとスロットの仕組みを持っています。
シグナルとスロットはオブジェクト間の通信に使用されます。特定のイベントが発生したときにシグナルが発行されます。スロットは任意のPython呼び出し可能オブジェクトです。
スロットは接続されたシグナルが発行されると呼び出されます。
1.Signal and slots
ここではシグナルとスロットの簡単な例としてスライダーのつまみを左右に動かすと表示された数字も変化(増減)するものを作っていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #!/usr/bin/python3 #-*- coding: utf-8 -*- """ In this example, we connect signal of a QSlider to a slot ppf a QLCDNumber. """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import(QWidget, QLCDNumber, QSlider,QVBoxLayout, QApplication) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): #数字ウィジェットを作成 lcd = QLCDNumber(self) #スライダーウィジェットを作成 sld = QSlider(Qt.Horizontal, self) vbox = QVBoxLayout() vbox.addWidget(lcd) vbox.addWidget(sld) self.setLayout(vbox) #スライダーを動かすと数字も変化する sld.valueChanged.connect(lcd.display) self.setGeometry(300,300,250,150) self.setWindowTitle('Signal and slot') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) |
sld.valueChanged.connect(lcd.display)
スライダーのvalueCahnged信号をLCD番号の表示スロットに接続します。
2.Reimplementing event handler(イベントハンドラの実装)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/usr/bin/python3 #coding: utf-8 """ In this example, we reimplement an event handler """ import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300,300,250,150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self,e): #エスケープキーを押すと画面が閉じる if e.key() == Qt.Key_Escape: self.close() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) |
ウィジェットでキーボードやマウスなどのイベントがおこるとそれに対応する関数が呼ばれます。キーボード入力の場合はQtWidget.KeyPressEvent()が呼ばれます。
イベントが起こった時に何か処理をしたい場合はウィジェットを継承して対応する関数を再実装(オーバーライド)することで実現します。
動画ではただ画面が出て閉じているだけでわからないのですが画面を閉じるときにはESCキーを押しています。