プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/02/07

[PySide] 'PySide6.QtCore.Signal' object has no attribute 'connect' のエラーが表示される

event_note2022/02/07 7:59

PySide で、Signal をコンストラクタで初期化すると 'PySide6.QtCore.Signal' object has no attribute 'connect' のエラーが表示されました。

環境

  • PySide 6.2.2.1

エラーとなる例

例えば、以下のようなコードではエラーになります。

class Sample(QObject):
  
  def __init__(self):
    super().__init__(None)
  
    self.signal = Signal(int)
    self.signal.connect(self.__slot)

これについて調べると、以下が見つかりました。

どうやら、シグナルを使うには以下の必要があるようです。

  • クラス内で定義する必要がある(コンストラクタで初期化ではダメ)
  • QObject を継承し、super().__init__() をコールする必要がある

解決方法

以下のようにすると上手く動作します。

class Sample(QObject):
  
  signal = Signal(int)
  
  def __init__(self):
    super().__init__(None)

    self.signal.connect(self.__slot)

コンストラクタで for を使ってシグナルを一気に作成したり発報したりしたかったのですが、できないんですかね?

どうしても for で楽がしたい

苦肉の策で、以下のようなコードを思いつきました。

class Sample(QObject):
  
  signal_a = Signal(int)
  signal_b = Signal(int)
  
  def __init__(self):
    super().__init__(None)

    self.__dict__['signal_a'].connect(self.__slot)

  def emit_sample(self, signal_name):
    if signal_name in self.__dict__.keys():
      self.__dict__[signal_name].emit(0)

シグナルの宣言は個別に行う必要がありますが、self.__dict__ でインスタンス変数の一覧を取得し、その中からシグナル名でシグナルを探してきます。
微妙ですね。