Как объекты 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()
чтобы избежать ненужных затрат, которые могут произойти при создании/уничтожении многих QWidget
s.