ラズパイデスクトップでPyQt5入門(9) Event and Signal in PyQt5(2)Event Object
こんばんは。國松です。
今回はPyQt5のtutorialのEvent and Signalの2回目です。まずはEvent Objectについてみていきたいと思います。
参考サイト
ZetCode PyQt5 tutorial
【PythonでGUI】PyQt5 -始めの一歩-
3.Event Object
イベントオブジェクトはイベントを記述する多数の属性を含むPythonのオブジェクトです。イベントオブジェクトは生成されたイベントに固有のものです。
今回の例ではラベルウィジェットにマウスポインタのX座標とY座標を表示していきます。
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 40 41 42 43 44 45 46 47 48 | #!/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_()) |
1 | self.setMouseTracking(True) |
マウストラッキングはデフォルトでは無効になっているので有効にします。
無効:マウス移動中に少なくとも1つのマウスボタンが押された場合のみマウス移動イベントを受け取る。
有効:ボタンが押されていなくてもマウス移動イベントを受けとる
1 2 3 4 5 6 | 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()メソッドを呼び出してどのボタンがクリックされたかを判断するものを作成していきます。
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 40 41 42 43 | #!.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()スロットに接続されます。ウィンドウをクリックするとアプリケーションが終了します。
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 | #!/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_()) |