11

QApplication() と QWidget() はどのように接続されていますか?

これは私がコピーしたサンプル コードで、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_())

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

4

1 に答える 1

12

QApplicationはシングルトンなので、インスタンスとやり取りするのは非常に簡単QWidgetです。QApplication.instance()QApplication

実際QWidget、 の前にインスタンス化しようとするQApplicationと、エラーが発生します。

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

これはおそらく、これが起こることを意味します。


編集: qtソースをダウンロードしましたが、実際にはsrc/gui/kernel/qwidget.cpp、328行目に次のものがあります。

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

はインスタンスqAppへのポインタですQApplication(つまり、 を呼び出すのと同じですQApplication.instance())。

したがって、必要ではありませんが、最終的にはグローバル変数を介してQWidgetと対話します。多くの を作成/破棄するときに発生する可能性のある不要なオーバーヘッドを回避するために、QApplicationおそらくqApp代わりに使用します。QApplication.instance()QWidget

于 2013-07-11T19:57:56.973 に答える