8

PySideのシグナルとスロットのページには、「シグナルはインスタンスが所有するランタイム オブジェクトであり、クラス属性ではありません」と記載されています。どうやら QObject コンストラクターはシグナルのクラス属性を調べて、それらをオブジェクトインスタンスにコピーします。これは私のテストプログラムによって確認されています。

PySideインポートQtCoreから

class Klass(QtCore.QObject):
    lst = []
    sig = QtCore.Signal(str)

def main():
    obj1 = Klass()
    obj2 = Klass()

    print "id: obj1.lst  = {}, obj1.sig  = {}".format(id(obj1.lst),  id(obj1.sig))
    print "id: obj2.lst  = {}, obj2.sig  = {}".format(id(obj2.lst),  id(obj2.sig))
    print "id: klass.lst = {}, klass.sig = {}".format(id(Klass.lst), id(Klass.sig))

if __name__ == '__main__':
    main()

私の出力では、lst-member の id がオブジェクトとクラスの両方で同じであるのに対し、現在 3 つのシグナル オブジェクトがあることがわかります。

id: obj1.lst  = 4317739344, obj1.sig  = 4297560376
id: obj2.lst  = 4317739344, obj2.sig  = 4297560400
id: klass.lst = 4317739344, klass.sig = 4317851072

オブジェクト属性を暗黙的に作成することは混乱を招くだけであり、したがって悪いスタイルです(IMHO)。多分彼らにはこれには正当な理由がありますが、私にはわかりません。私の質問は、コンストラクターでシグナルを通常の属性として作成するだけでなく、なぜこのソリューションを選択したのですか?

4

1 に答える 1

10

コピーではありません。PySide.QtCore.Signalそれらのタイプを確認すると、class 属性がで、instance 属性が であることがわかりますPySide.QtCore.SignalInstance

print "type(obj1.sig): {}".format(type(obj1.sig))
print "type(obj2.sig): {}".format(type(obj2.sig))
print "type(Klass.sig): {}".format(type(Klass.sig))

# type(obj1.sig): <type 'PySide.QtCore.SignalInstance'>
# type(obj2.sig): <type 'PySide.QtCore.SignalInstance'>
# type(Klass.sig): <type 'PySide.QtCore.Signal'>

これは、Qt がシグナルを定義する方法のために必要です。Qt はメタオブジェクト システムを使用してシグナル/スロットを登録します。これを機能させるために、PySide は背後でいくつかの「魔法」を実行して、カスタム クラス属性シグナルをメタオブジェクト システムに登録SignalInstanceし、インスタンス属性と同じ名前の使用可能なシグナル ( ) を返します。

オリジナルSignalはまだありますが、インスタンス属性で上書きされています:

print "obj1.sig -> type: {}, id: {}".format(type(obj1.sig), id(obj1.sig))
print "obj1.__class__.sig -> type: {}, id: {}".format(type(obj1.__class__.sig), id(obj1.__class__.sig))
print "Klass.sig -> type: {}, id: {}".format(type(Klass.sig), id(Klass.sig))

# obj1.sig -> type: <type 'PySide.QtCore.SignalInstance'>, id: 40629904
# obj1.__class__.sig -> type: <type 'PySide.QtCore.Signal'>, id: 41556352
# Klass.sig -> type: <type 'PySide.QtCore.Signal'>, id: 41556352
于 2013-02-22T21:34:29.733 に答える