gpt4 book ai didi

python - qApp 与 QApplication.instance()

转载 作者:太空狗 更新时间:2023-10-29 19:35:46 30 4
gpt4 key购买 nike

使用 PyQt5,这两个都返回应用程序对象:

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

但是为什么 print(QtWidgets.QApplication.instance() is QtWidgets.qApp) 打印 False

最佳答案

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 实例。如果模块更像类,这样它们就可以拥有动态属性,那么 qApp 就可以像 QApplication.instance() 一样工作,并且最初返回 。但因为它是静态的,所以它必须始终返回正确类型的对象,以便它以后可以引用与 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 的原因是,这两个对象是围绕相同底层的不同 python 包装器C++ 对象。

如果您需要创建自己的 QApplication 子类,但仍想使用 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

关于python - qApp 与 QApplication.instance(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40400954/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com