PySide は次のように主張していSignals can be defined using the QtCore.Signal() class. Python types and C types can be passed as parameters to it. If you need to overload it just pass the types as tuples or lists
ます。PySide Doc Signals and Slots in PySideから、一度に複数のシグナルを作成する方法を示しました。その行は次のとおりです。
# create two new signals on the fly: one will handle
# int type, the other will handle strings
speak = QtCore.Signal((int,), (str,))
私は少し遠くまで行って、次のようなものを作成しました(学習目的で):
speak = QtCore.Signal((int,), (str,), (tuple,), (list,), (A,), (B,), (Exception,), (unicode,), (float,))
A
とB
は、私が作成した 2 つの異なるダミーの新しいスタイル クラスです。次に、実際に作成された信号の数を出力して調査しました。
print someone.speak
print someone.speak[int]
print someone.speak[str]
print someone.speak[tuple]
print someone.speak[list]
print someone.speak[A]
print someone.speak[B]
print someone.speak[Exception]
print someone.speak[unicode]
print someone.speak[float]
そして、私はこれらを手に入れました:
<PySide.QtCore.SignalInstance object at 0x02179BA0>
<PySide.QtCore.SignalInstance object at 0x02179BA0>
<PySide.QtCore.SignalInstance object at 0x02179BB0>
<PySide.QtCore.SignalInstance object at 0x02179BC0>
<PySide.QtCore.SignalInstance object at 0x02179BC0>
<PySide.QtCore.SignalInstance object at 0x02179BC0>
<PySide.QtCore.SignalInstance object at 0x02179BC0>
<PySide.QtCore.SignalInstance object at 0x02179BC0>
<PySide.QtCore.SignalInstance object at 0x02179BB0>
<PySide.QtCore.SignalInstance object at 0x02179C00>
観察: tuple
、list
、Exception
および私のカスタムA
でB
、同じ信号を取得しました。タプルとリストは少し一般的であり、PySide でオーバーロードするために使用されることを知っています。しかし、なぜ私のA
とB
も同じ信号を受け取るのでしょうか? のような本当にプリミティブな型だけのように見えint
、float
Pythonstr
では新しいシグナルを取得します。
誰でもこの奇妙な動作を説明できますか?
よろしくお願いします!
[アップデート]
実際の PySide プロジェクトで問題が発生したときに、上記の調査を行いました。実際のバージョンを次のように単純化しました。
#!/usr/bin/env python
import sys
from PySide import QtCore
class A(object):
def __init__(self, msg):
self.msg = msg
class B(object):
def __init__(self, msg):
self.msg = msg
@QtCore.Slot(A)
def sayA(a):
print 'From sayA:', a.msg
@QtCore.Slot(B)
def sayB(b):
print 'From sayB:', b.msg
class Communicate(QtCore.QObject):
speak = QtCore.Signal((A,), (B,))
someone = Communicate()
someone.speak[A].connect(sayA)
someone.speak[B].connect(sayB)
someone.speak[A].emit(A('A is good'))
someone.speak[B].emit(B('B is bad'))
印刷されます:
From sayA: A is good
From sayB: A is good
From sayA: B is bad
From sayB: B is bad
sayAA is good
からのみ印刷されると思っていました。