はじめに
PySide2の各種ウィジェットには,あらかじめ動作予定のイベントが登録されている.例えば,マウスがウィジェットに乗っかった場合やクリックされた場合などが挙げられる.
これらのイベントは継承先のクラスで関数のオーバーライドをすることで,イベントに沿った動作を定義することができる.その定義の仕方を説明する.
簡単なソースコード
まずは,サンプルになる簡単なソースコードを載せる.
from PySide2.QtWidgets import QVBoxLayout, QLabel
class NewTextLabel(QLabel):
def __init__(self, text:str, parent:QVBoxLayout):
super().__init__("<b>{0}</b>".format(text))
self.text = text
parent.addWidget(self)
def enterEvent(self, event):
self.setText("<b style='background-color: #00ff00;'>{0}</b>".format(self.text))
def leaveEvent(self, event):
self.setText("<b>{0}</b>".format(self.text))
NewTextLabel
クラスはQLabel
クラスを継承している.QLabel
クラスの先ではenterEvent
とleaveEvent
が定義されている.このソースコードでは,それらの関数をオーバーライドすることで,イベントが発生したときの動作を定義している.
各種ウィジェットにはこのようなイベントが既に定義されているので,自分好みのイベントがあればオーバーライドすればいい.
問題はイベントが定義されていなかった場合になる.この場合はシグナルにスロットを接続して,スロットからイベントを発生させるしかない.イベントはシグナルからemit
を呼び出されて実行される.スロットもイベントも同じではないかと言えば同じように見える.正直,なぜイベントという名前をつけているのかわからない.
この仕組みがかなり厄介で,イベントとスロットの違いについてもわかりやすく説明したサイトもない.なんとなく,コードを読んでそんなもんか,と理解するしかないのが現状なので,より多くのPySideユーザがQiitaに投稿すればデスクトップ開発も賑わうと思う.