2013-07-11 8 views
7

Wie QApplication() und QWidget() verbunden sind?Wie sind die Objekte QApplication() und QWidget() in PySide/PyQt verbunden?

Dies ist ein Beispielcode, den ich kopiert habe, er erstellt QApplication-Objekt und QWidget-Objekt, aber es gibt keine Verknüpfung zwischen den beiden Objekten. Ich erwartete etwas wie app.setWidget(did), PySide/PyQt-Controller über das Widget zu lehren, das erstellt wurde.

# 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_()) 

Was ist die Magie dahinter?

Antwort

8

QApplication ist ein Singleton so wäre es ziemlich einfach sein, für QWidget zu tun: QApplication.instance() und Interaktion mit der QApplication Instanz.

In der Tat versucht QWidget vor dem QApplication führt zu einem Fehler zu instanziieren:

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

was wahrscheinlich bedeutet, das ist, was passiert.


Edit: Ich habe die qt Quellen heruntergeladen und in der Tat, in src/gui/kernel/qwidget.cpp, Linie 328 gibt es:

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

Wo qApp einen Zeiger auf die QApplication Instanz ist (dh es entspricht dem Aufruf QApplication.instance()).

Also interagiert die QWidget am Ende mit der QApplication über eine globale Variable, obwohl es nicht notwendig ist. Sie verwenden wahrscheinlich qApp anstelle von QApplication.instance(), um unnötigen Overhead zu vermeiden, der beim Erstellen/Zerstören vieler QWidget s auftreten könnte.

Verwandte Themen