あなたは本当に何が起こっているかをチェックするために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
も参照されます。
ここでの意図は、という1つのアプリケーションオブジェクトだけであるということです。しかし、Qtクラスは本当に真のシングルトンではありません。 、しかし、あなたが複数のインスタンスを作成し、同じことがCに真でなければなりません停止するには何もないのPyQtで
>>> app2 = QtGui.QApplication([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: A QApplication instance already exists.
++:この結果として、PySideはあなたが別のインスタンスを作成しようとするとエラーを発生させることを選択しました。おそらく、これは通常、未定義の動作につながると文書化されています。 PySideとは異なり、qApp
インスタンスはかなりのPythonよりも、C++で作成され、PyQtはラッパーが同じではない、ということ
# 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++
注:PyQtはをsip.dump
を使用して
は、他のいくつかの重要な違いを示しています。 qApp
は単にそれを無視するので、QApplication
の独自のサブクラスを作成することを決定した場合、これは重要なポイントです。あなたはqApp
は独自のサブクラスを参照したい場合は、明示的に設定する必要があり、このように:PySideで
myapp = MyCustomApplication(sys.argv)
QtGui.qApp = myapp
、この小さなハックは必要ありません。
QApplicationがQCoreApplicationから継承するため、 'instance()'メソッドは両方のクラスに存在します。どちらの場合でも、同じメソッドを呼び出しています。これは、アプリケーションをインスタンス化したものを返します。もちろん、C++では戻り値を型キャストする必要があるかもしれません... – user3419537
@ user3419537あなたは正しいです。私はあなたがそれを呼び出していたクラスの正しい型を返すようにオーバーライドしていると仮定していますが、何も言及していないと思います(C++でそれを行うこともできるとしますか?) –
ありがとう..シンプルで説明的 –