Как объекты 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.