大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

ラズパイデスクトップでPyQt5入門(8) Event and Signal in PyQt5(1)

著者:國松亜紗子
公開日:2019/10/15
最終更新日:2019/10/15
カテゴリー:技術情報

こんばんは。國松です。

今回は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
ここではシグナルとスロットの簡単な例としてスライダーのつまみを左右に動かすと表示された数字も変化(増減)するものを作っていきます。

#!/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(イベントハンドラの実装)

#!/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キーを押しています。

 

    上に戻る