2013-07-11 9 views
7

In che modo QApplication() e QWidget() sono connessi?In che modo gli oggetti QApplication() e QWidget() sono connessi in PySide/PyQt?

Questo è un codice di esempio che ho copiato, crea oggetto QApplication e oggetto QWidget, ma non esiste alcun collegamento tra i due oggetti. Mi aspettavo qualcosa come app.setWidget(did) per insegnare al controller PySide/PyQt il widget che è stato creato.

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

Qual è la magia dietro questo?

risposta

8

QApplication è un singoletto quindi sarebbe abbastanza facile, per QWidget da fare: QApplication.instance() e interagire con l'istanza QApplication.

Infatti tentativo di creare un'istanza QWidget prima della QApplication porta ad un errore:

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

Il che probabilmente significa che questo è ciò che accade.


Edit: Ho scaricato i sorgenti QT e di fatto, in src/gui/kernel/qwidget.cpp, linea 328, non c'è:

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

Dove qApp è un puntatore all'istanza QApplication (vale a dire che equivale a chiamare QApplication.instance()).

Quindi, alla fine, lo QWidget interagisce con QApplication tramite una variabile globale, anche se non è necessario. Probabilmente usano qApp invece di QApplication.instance() per evitare un sovraccarico non necessario che potrebbe accadere quando si creano/distruggono molti QWidget s.

Problemi correlati