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

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

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

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

こんばんは。國松です。
今回はPyQt5のtutorialのEvent and Signalの2回目です。まずはEvent Objectについてみていきたいと思います。

参考サイト
ZetCode PyQt5 tutorial
【PythonでGUI】PyQt5 -始めの一歩-

3.Event Object
イベントオブジェクトはイベントを記述する多数の属性を含むPythonのオブジェクトです。イベントオブジェクトは生成されたイベントに固有のものです。
今回の例ではラベルウィジェットにマウスポインタのX座標とY座標を表示していきます。

#!/usr/bin/python3
#-*- coding: utf-8 -*-

"""
In this example, we display the x and y
coordinates of a mouse pointer in a label widget.
ラベルウィジェット内のマウスポインタの座標
"""

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget,QApplication,QGridLayout,QLabel

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
         grid = QGridLayout()

         x = 0
         y = 0

         self.text = "x: {0}, y: {1}".format(x,y)

         self.label = QLabel(self.text, self)
         grid.addWidget(self.label, 0, 0, Qt.AlignTop)

         self.setMouseTracking(True)

         self.setLayout(grid)

         self.setGeometry(300,300,350,200)
         self.setWindowTitle('Event objext')
         self.show()

    def mouseMoveEvent(self, e):
        x = e.x()
        y = e.y()

        text = "x: {0}, y: {1}".format(x,y)
        self.label.setText(text)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

self.setMouseTracking(True)

マウストラッキングはデフォルトでは無効になっているので有効にします。
無効:マウス移動中に少なくとも1つのマウスボタンが押された場合のみマウス移動イベントを受け取る。
有効:ボタンが押されていなくてもマウス移動イベントを受けとる

    def mouseMoveEvent(self, e):
        x = e.x()
        y = e.y()

        text = "x: {0}, y: {1}".format(x,y)
        self.label.setText(text)

eがイベントオブジェクトです。イベントオブジェクトにはトリガーされたイベントのデータが含まれています。今回の場合はマウス移動イベントです。
x(),y()関数でマウスポインタのx座標,y座標を取得します。取得した情報を文字列にしてそれをラベルウィジェットに設定します。

4.Event sender(ボタンクリック時のイベント発生)
どのウィジェットがシグナルの送信者か知るにはsender()メソッドを使用します。
ここではbuttonclick()メソッドでsender()メソッドを呼び出してどのボタンがクリックされたかを判断するものを作成していきます。

#!.usr/bin/python3
#-*- coding: utf-8 -*-

"""
In this example, we determine the event sendet object
"""

import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton,  QApplication

class Example(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        btn1 = QPushButton("Bttuon 1",self)
        btn1.move(30,50)

        btn2 = QPushButton("Bttuon 2",self)
        btn2.move(150,50)
        
        #両方のボタンは同じスロットに接続されている
        btn1.clicked.connect(self.buttonClicked)
        btn2.clicked.connect(self.buttonClicked)

        self.statusBar()

        self.setGeometry(300,300,290,150)
        self.setWindowTitle('Event sender')
        self.show()

    def buttonClicked(self):
        #sender()メソッドを呼び出して信号ソースを決定
        sender = self.sender()
        #ステータスバーにメッセージを表示
        self.statusBar().showMessage(sender.text() + ' was pressed')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


 
5.Emitting Signal(カスタム信号)
QObjectから作成されたオブジェクトはシグナルを出すことができます。
ここではcloseAppというカスタム信号(新しいシグナル)を作成していきたいと思います。
closeAppはマウスクリックイベント中に発生します。信号はQMainWindowのclose()スロットに接続されます。ウィンドウをクリックするとアプリケーションが終了します。

#!/usr/bin/python3
#-*- coding: utf-8 -*-

"""
In This example, we show how to emit
a custom signal
"""

import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication

class Communicate(QObject):
    closeApp = pyqtSignal()

class Example(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #Communicateオブジェクトの作成
        self.c = Communicate()
        #closeAppに画面を閉じる命令を設定
        self.c.closeApp.connect(self.close)

        self.setGeometry(300,300,290,150)
        self.setWindowTitle('Emit signal')
        self.show()

    def mousePressEvent(self,evet):
    #マウスでクリックしたときに画面を閉じる命令を実行
        self.c.closeApp.emit()

if __name__ == '__main__':
    app =QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 

    上に戻る