簡體   English   中英

QtGui.QApplication和QtCore.QCoreApplication之間的區別

[英]Difference between QtGui.QApplication and QtCore.QCoreApplication

關於QtGui的已知之處在於它用於GUI程序來創建接口,而QtCore用於非GUI程序並且實際上在接口下工作。 但是為了獲得正在運行的應用程序的實例,我發現我們可以使用QtCore和QtGui來使用QtCore.QCoreApplicationQtGui.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中,不需要這個小小的黑客。

沒有區別,因為QApplicationinstance()方法是從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM