LoginSignup
1
1

More than 5 years have passed since last update.

PySide2でイベントをオーバーライドする

Posted at

はじめに

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クラスの先ではenterEventleaveEventが定義されている.このソースコードでは,それらの関数をオーバーライドすることで,イベントが発生したときの動作を定義している.

各種ウィジェットにはこのようなイベントが既に定義されているので,自分好みのイベントがあればオーバーライドすればいい.

問題はイベントが定義されていなかった場合になる.この場合はシグナルにスロットを接続して,スロットからイベントを発生させるしかない.イベントはシグナルからemitを呼び出されて実行される.スロットもイベントも同じではないかと言えば同じように見える.正直,なぜイベントという名前をつけているのかわからない.

この仕組みがかなり厄介で,イベントとスロットの違いについてもわかりやすく説明したサイトもない.なんとなく,コードを読んでそんなもんか,と理解するしかないのが現状なので,より多くのPySideユーザがQiitaに投稿すればデスクトップ開発も賑わうと思う.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1