2016-04-11 70 views
1

QtGuiは、GUIプログラムでインターフェイスを作成するために使用され、QtCoreはGUI以外のプログラム用であり、実際にはインターフェイスで動作することが知られています。しかし、実行中のアプリケーションのインスタンスを取得するには、QtCoreとQtGuiを使用して、QtCore.QCoreApplicationQtGui.QApplicationを使用して現在実行中のインスタンスを返すことができることがわかりました。QtGui.QApplicationとQtCore.QCoreApplicationの相違点

だから、それらを使って返されたインスタンスの違いは何ですか? 彼らは同じことを指していますか?

答えて

1

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++では、この型キャストを自分で行う必要があります。

+0

QApplicationがQCoreApplicationから継承するため、 'instance()'メソッドは両方のクラスに存在します。どちらの場合でも、同じメソッドを呼び出しています。これは、アプリケーションをインスタンス化したものを返します。もちろん、C++では戻り値を型キャストする必要があるかもしれません... – user3419537

+0

@ user3419537あなたは正しいです。私はあなたがそれを呼び出していたクラスの正しい型を返すようにオーバーライドしていると仮定していますが、何も言及していないと思います(C++でそれを行うこともできるとしますか?) –

+0

ありがとう..シンプルで説明的 –

2

あなたは本当に何が起こっているかをチェックするために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 

、この小さなハックは必要ありません。