2011-09-28 6 views
1
from PySide.QtCore import * 

class Eggs(QObject): 
    evt_spam = Signal() 
    print "Loaded" 

a = Eggs() 
b = Eggs() 
print a.evt_spam 
print b.evt_spam 
print a.evt_spam is b.evt_spam 

출력 : (하다면 왜 생성되는 신호의 두 경우가있다 (이 클래스 변수 예상대로) "부하"PySide 신호 "복제"동작

Loaded 
<PySide.QtCore.Signal object at 0xa2ff1a0> 
<PySide.QtCore.Signal object at 0xa2ff1b0> 
False 

번만 인쇄 그것은 또한 클래스 변수입니다)?

+0

:

class Test(QObject): def __init__(self, signal): self.evt_spam = signal sig = Signal() a = Test(sig) b = Test(sig) 

또는이 : 아마도 당신은이 같은 속성을 할당 할 수 있습니다? 그것은 단지 작동하는 것이 중요합니다 : 모든 인스턴스가 신호를 방출 할 수 있고 모든 가입자 (신호에 연결된 모든 인스턴스)가 신호를 얻습니다. 나는 그것이 흥미 롭다는 것에 동의한다. 그러나 결함이 아니거나 대부분의 프로그램에 제한을 두지 않습니다. – bootchk

답변

3

클래스 인스턴스를 만들 때 인쇄되지 않고 클래스 범위가 실행될 때 인쇄됩니다. 이 코드는 "Test"의 인스턴스를 만들지는 않았지만 "로드 됨"을 인쇄합니다. 당신은 클래스가 초기화 될 때 코드를 실행하려면

class Test: 
    print "Loaded" 

__init__()를보십시오. 이 코드는 클래스가 정의 될 때가 아니라 인스턴스가 만들어 질 때 "로드 됨"을 인쇄합니다. QT의 QObject를 메타 클래스

class Test: 
    def __init__(self): 
     print "Loaded" 

클래스를 재 작성하는 것은 당신이 클래스의 새로운 인스턴스를 초기화 할 때 중복 신호를 방지하기 위해 속성이 나타납니다. 문제는 학술 아닌가

class Test(QObject): 
    def signal(self, signal): 
     self.evt_spam = evt_spam 
     return self 

evt_spam = Signal() 
a = Test().signal(evt_spam) 
b = Test().signal(evt_spam) 
+0

예, 이해하지만 신호의 인스턴스가 2 개 만들어 집니까? 질문을 명확하게하기 위해 편집하겠습니다. –

+0

'QObject'는 메타 클래스입니다. 내 생각 엔 클래스 속성을 망가 뜨리는 것입니다. 'QObject'를 상속받지 않으면 결과가 달라집니다. 맞습니까? – lunixbochs

+0

'QObject'를'object'로 변경하면 신호는 작동하지 않지만 변수는 같은 메모리 위치를 가리 킵니다. 아마 맞을 것입니다. Qt의 향후 릴리스에서이 변화의 기회가 무엇이라고 생각하십니까? –