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