2013-07-11 18 views
7

Jak są połączone QApplication() i QWidget()?W jaki sposób obiekty QApplication() i QWidget() są połączone w PySide/PyQt?

To jest przykładowy kod, który skopiowałem, tworzy obiekt QApplication i obiekt QWidget, ale nie ma połączenia między tymi dwoma obiektami. Spodziewałem się czegoś takiego jak app.setWidget(did), aby nauczyć kontrolera PySide/PyQt o utworzonym widżecie.

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

Co za magia tego?

Odpowiedz

8

QApplication to singleton, więc byłoby całkiem łatwo, dla QWidget zrobić: QApplication.instance() i współdziałać z instancją QApplication.

W rzeczywistości próbuje instancję QWidget przed QApplication prowadzi do błędu:

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

Które prawdopodobnie oznacza to, co się dzieje.


Edit: Pobrałem źródła Qt i faktycznie, w src/gui/kernel/qwidget.cpp, linia 328, jest:

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

Gdzie qApp jest wskaźnik do instancji QApplication (czyli jest odpowiednikiem wywołania QApplication.instance()).

Ostatecznie QWidget wchodzi w interakcję z QApplication za pośrednictwem zmiennej globalnej, nawet jeśli nie jest to konieczne. Prawdopodobnie używają qApp zamiast QApplication.instance(), aby uniknąć niepotrzebnego narzutu, który może się zdarzyć podczas tworzenia/niszczenia wielu QWidget s.

Powiązane problemy