2016-11-03 10 views
5

,이 모두는 응용 프로그램 개체 반환) :QAPP QApplication.instance 대는 (PyQt5와

app = QtWidgets.QApplication.instance() 
app = QtWidgets.qApp 
for i in app.arguments()[1:]: 
    ... 

을 왜 print(QtWidgets.QApplication.instance() is QtWidgets.qApp) 인쇄 False은 무엇입니까?

답변

13

QtWidgets.QApplication.instance()QtWidgets.qApp과의 차이점은 후자는 모듈이 먼저 반입 될 때 생성되어야 모듈 정적 변수 점이다. 이것은 다음과 같은 초기 이해할 수없는 행동 결과 :

>>> from PyQt5 import QtWidgets 
>>> inst = QtWidgets.QApplication.instance() 
>>> qapp = QtWidgets.qApp 
>>> (inst, qapp) 
(None, <PyQt5.QtWidgets.QApplication object at 0x7ff3c8bd3948>) 

그래서 더 QApplication 객체가 아직 생성되지 않은 경우에도 qApp 변수는 여전히 QApplication 예를 가리 킵니다. 모듈이 동적 속성을 가질 수 있도록 클래스와 비슷하다면 은 QApplication.instance()과 똑같이 작동하고 처음에는 None을 반환 할 수 있습니다. 그러나 정적이기 때문에 항상 올바른 유형의 객체를 반환해야하므로 나중에 QApplication.instance()과 동일한 기본 C++ 객체를 참조 할 수 있습니다.

그러나 qApp 처음에 그냥 래퍼입니다 점에 유의하는 것이 중요합니다 :

>>> qapp.objectName() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
RuntimeError: wrapped C/C++ object of type QApplication has been deleted 

QApplication이 생성되면,하지만, 그들은 것 같은 일을 두 점 :

>>> app = QtWidgets.QApplication([]) 
>>> app.setObjectName('foo') 
>>> qapp.objectName() 
'foo' 

(QtWidgets.QApplication.instance() is QtWidgets.qApp)False을 반환하는 이유는 두 개체가 동일한 기본 C++ 개체 주위의 다른 파이썬 래퍼입니다.

당신이 이제까지 QApplication의 자신의 sublass를 작성해야하는 경우이 점을 인식하는 것이 중요합니다,하지만 여전히 qApp를 사용하려면 :

>>> from PyQt5 import QtWidgets 
>>> class MyApp(QtWidgets.QApplication): 
...  def hello(self): print('Hello World') 
... 
>>> myapp = MyApp([]) 
>>> myapp.hello() 
Hello World 
>>> 
>>> QtWidgets.qApp 
<PyQt5.QtWidgets.QApplication object at 0x7f5e42f40948> 
>>> QtWidgets.qApp.hello() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'QApplication' object has no attribute 'hello' 
>>> 
>>> inst = QtWidgets.QApplication.instance() 
>>> inst 
<__main__.MyApp object at 0x7f5e42f409d8> 
>>> inst.hello() 
Hello World 

이 주변에있는 유일한 방법은 명시 적으로 qApp 모듈을 덮어 쓰기하는 것입니다 변수 (다른 모듈에서 가져 오기 전에 완료되었는지 분명히 확인하십시오) :

>>> QtWidgets.qApp = myapp 
>>> QtWidgets.qApp.hello() 
Hello World