![](/img/trans.png)
[英]Why is QtGui.QApplication working but marked as undefined in PyDev?
[英]Difference between QtGui.QApplication and QtCore.QCoreApplication
關於QtGui的已知之處在於它用於GUI程序來創建接口,而QtCore用於非GUI程序並且實際上在接口下工作。 但是為了獲得正在運行的應用程序的實例,我發現我們可以使用QtCore和QtGui來使用QtCore.QCoreApplication
和QtGui.QApplication
返回當前運行的實例。
那么使用它們返回的實例有什么區別? 他們指的是同一件事嗎?
您可以使用shiboken
模塊檢查實際發生的情況:
>>> import shiboken
>>> from PySide import QtCore, QtGui
>>> app = QtGui.QApplication([])
>>> app
<PySide.QtGui.QApplication object at 0x7fc6031c98c8>
>>> print(shiboken.dump(app))
C++ address....... PySide.QtGui.QApplication/0x11446c0
hasOwnership...... 0
containsCppWrapper 1
validCppObject.... 1
wasCreatedByPython 1
>>> print(shiboken.dump(QtGui.QApplication.instance()))
C++ address....... PySide.QtGui.QApplication/0x11446c0
hasOwnership...... 0
containsCppWrapper 1
validCppObject.... 1
wasCreatedByPython 1
>>> print(shiboken.dump(QtCore.QCoreApplication.instance()))
C++ address....... PySide.QtGui.QApplication/0x11446c0
hasOwnership...... 0
containsCppWrapper 1
validCppObject.... 1
wasCreatedByPython 1
>>> print(shiboken.dump(QtGui.qApp))
C++ address....... PySide.QtGui.QApplication/0x11446c0
hasOwnership...... 0
containsCppWrapper 1
validCppObject.... 1
wasCreatedByPython 1
如您所見,每次都會引用相同的底層C ++對象。 如果您創建了QCoreApplication
,則每次都會引用相同的QCoreApplication
。
這里的意圖是應該只有一個應用程序對象。 但是Qt課程並不是真正的單身人士。 因此,如果您嘗試創建另一個實例,PySide會選擇引發錯誤:
>>> app2 = QtGui.QApplication([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: A QApplication instance already exists.
但是,在PyQt中,沒有什么可以阻止你創建多個實例,在C ++中也必須如此。 據推測,它在某處被記錄為通常會導致未定義的行為。
在PyQt中使用sip.dump
顯示一些其他重要的區別:
# NB: abbreviated output
>>> import sip
>>> from PyQt4 import QtCore, QtGui
>>> app = QtGui.QApplication([])
>>> sip.dump(app)
<PyQt4.QtGui.QApplication object at 0x7fc801a91678>
Reference count: 3
Address of wrapped object: 0x25190e0
Created by: Python
To be destroyed by: Python
>>> sip.dump(QtCore.QCoreApplication.instance())
<PyQt4.QtGui.QApplication object at 0x7fc801a91678>
Reference count: 3
Address of wrapped object: 0x25190e0
Created by: Python
To be destroyed by: Python
>>> sip.dump(QtGui.QApplication.instance())
<PyQt4.QtGui.QApplication object at 0x7fc801a91678>
Reference count: 3
Address of wrapped object: 0x25190e0
Created by: Python
To be destroyed by: Python
>>> sip.dump(QtGui.qApp)
<PyQt4.QtGui.QApplication object at 0x7fc801a91558>
Reference count: 3
Address of wrapped object: 0x25190e0
Created by: C/C++
To be destroyed by: C/C++
需要注意的是,不同於PySide的qApp
實例由C ++,而不是Python的創建,PyQt的包裝是不一樣的 。 如果您決定創建自己的QApplication
子類,那么這一點很重要,因為qApp
會忽略它! 如果您希望qApp
引用您自己的子類,則需要顯式設置它,如下所示:
myapp = MyCustomApplication(sys.argv)
QtGui.qApp = myapp
在PySide中,不需要這個小小的黑客。
沒有區別,因為QApplication
的instance()
方法是從QCoreApplication
繼承的。 您還可以演示如下:
>>> from PyQt4.QtCore import QCoreApplication
>>> from PyQt4.QtGui import QApplication
>>> a = QApplication([])
>>> a
<PyQt4.QtGui.QApplication object at 0x02A75620>
>>> QApplication.instance()
<PyQt4.QtGui.QApplication object at 0x02A75620>
>>> QCoreApplication.instance()
<PyQt4.QtGui.QApplication object at 0x02A75620>
>>> b = QCoreApplication([])
>>> b
<PyQt4.QtCore.QCoreApplication object at 0x02A75670>
>>> QCoreApplication.instance()
<PyQt4.QtCore.QCoreApplication object at 0x02A75670>
>>> QApplication.instance()
<PyQt4.QtCore.QCoreApplication object at 0x02A75670>
請注意,無論您使用哪個類來訪問實例,PyQt都正確地對對象進行類型轉換。 在C ++中,您需要自己進行類型轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.