2013-07-11 10 views
7

QApplication()とQWidget()はどのように接続されていますか?QApplication()とQWidget()オブジェクトがPySide/PyQtでどのように接続されていますか?

これは、コピーしたQApplicationオブジェクトとQWidgetオブジェクトを作成するサンプルコードですが、2つのオブジェクト間にリンクはありません。私はapp.setWidget(did)のようなものが、作成されたウィジェットについてPySide/PyQtコントローラを教えることを期待していました。

# http://zetcode.com/gui/pysidetutorial/firstprograms/ 
# 1. PySide.QtGui is the class 
import sys 
from PySide import QtGui 

# 2. setup the application 
app = QtGui.QApplication(sys.argv) 

# 3. create the widget and setup 
wid = QtGui.QWidget() 
wid.resize(250, 150) 
wid.setWindowTitle('Simple') 

# 4. Show the widget 
wid.show() 

# 5. execute the app 
sys.exit(app.exec_()) 

これの背後にある魔法は何ですか?

答えて

8

QApplicationはシンプルですので、QWidgetQApplication.instance()と対話し、QApplicationインスタンスと対話します。 QApplicationQWidgetをインスタンス化しようとしている事実

はエラーにつながる:おそらくこれは何が起こるかであることを意味し

>>> QtGui.QWidget() 
QWidget: Must construct a QApplication before a QPaintDevice 

を。


編集:私はQtのソースをダウンロードして、実際に、src/gui/kernel/qwidget.cppに、ライン328は、そこにある:(qAppQApplicationインスタンスへのポインタをある

if (!qApp) { 
    qFatal("QWidget: Must construct a QApplication before a QPaintDevice"); 
    return; 
} 

すなわち、それをQApplication.instance()を呼び出すのと同じです)。

最後に、QWidgetは、不要であるとしても、グローバル変数を介してQApplicationと対話します。多くの場合、QWidgetの作成/破棄時に発生する不必要なオーバーヘッドを避けるため、QApplication.instance()ではなくqAppを使用します。

関連する問題