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__
でインスタンス変数の一覧を取得し、その中からシグナル名でシグナルを探してきます。
微妙ですね。