1

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 Si​​gnals 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,))

ABは、私が作成した 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>

観察: tuplelistExceptionおよび私のカスタムAB、同じ信号を取得しました。タプルとリストは少し一般的であり、PySide でオーバーロードするために使用されることを知っています。しかし、なぜ私のABも同じ信号を受け取るのでしょうか? のような本当にプリミティブな型だけのように見えintfloatPythonstrでは新しいシグナルを取得します。

誰でもこの奇妙な動作を説明できますか?

よろしくお願いします!

[アップデート]

実際の 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からのみ印刷されると思っていました。

4

2 に答える 2

1

あなたの質問に関連する質問へのこの回答を参照してください。

はい、Python オブジェクトでシグナルを定義することが可能です。次を使用できます。

signal_node_selected = QtCore.Signal(オブジェクト)

カスタム Python クラスを渡すことは、 を渡すと見なされると仮定しobjectます。信号でそれらを区別する方法はありません。

于 2013-07-30T10:53:26.403 に答える