Как объекты QApplication() и QWidget() связаны в PySide/PyQt?

Как связаны QApplication() и QWidget ()?

это пример кода, который я скопировал, он создает объект QApplication и объект QWidget, но между двумя объектами нет связи. Я ожидал чего-то вроде 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_())

в чем магия этого?

1 ответов


QApplication является синглтоном, поэтому это было бы довольно легко, для QWidget чтобы делать: QApplication.instance() и взаимодействовать с QApplication экземпляра.

на самом деле пытается создать экземпляр QWidget до QApplication приводит к ошибке:

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

что, вероятно, означает, что это то, что происходит.


Edit: я загрузил источники 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() чтобы избежать ненужных затрат, которые могут произойти при создании/уничтожении многих QWidgets.