How QApplication() and QWidget() are connected?
This is an example code that I copied, it creates QApplication object and QWidget object, but there is no link between the two objects. I expected something like app.setWidget(did)
to teach PySide/PyQt controller about the widget that was created.
# 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_())
What's the magic behind this?
The QApplication class manages the GUI application’s control flow and main settings. More … QApplication specializes QGuiApplication with some functionality needed for QWidget -based applications. It handles widget specific initialization, finalization.
One of the main classes in Qt5 is the QWidget class. To create your own user interface it is this QWidget class that you will use, and it’s what PyXLL will embed into Excel as a Custom Task Pane.
This document is not a guide to use PySide or PyQt. It is only intended to instruct you on how to use PySide and PyQt with the Custom Task Pane feature of PyXLL. You should refer to the relevant package documentation for details of how to use each package.
Python/Qt makes it easy to allow user interaction; it has a very simple, sensible set of widgets, and they are easy to connect to your application's logic. Let's look at a few. One of the simplest ways to allow users to interact with an application is to let them click a button. Unsurprisingly, Qt has those, called a QPushButton.
QApplication
is a singleton so it would be pretty easy, for QWidget
to do: QApplication.instance()
and interact with the QApplication
instance.
In fact trying to instantiate QWidget
before the QApplication
leads to an error:
>>> QtGui.QWidget()
QWidget: Must construct a QApplication before a QPaintDevice
Which probably means this is what happens.
Edit: I've downloaded the qt sources and in fact, in src/gui/kernel/qwidget.cpp
, line 328, there is:
if (!qApp) {
qFatal("QWidget: Must construct a QApplication before a QPaintDevice");
return;
}
Where qApp
is a pointer to the QApplication
instance(i.e. it is equivalent to calling QApplication.instance()
).
So, in the end, the QWidget
interacts with the QApplication
via a global variable, even though it isn't necessary. They probably use qApp
instead of QApplication.instance()
to avoid unnecessary overhead that might happen when creating/destroying many QWidget
s.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With