Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How QApplication() and QWidget() objects are connected in PySide/PyQt?

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?

like image 815
prosseek Avatar asked Jul 11 '13 19:07

prosseek


People also ask

What is qapplication in qwidget?

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.

What is qwidget in Qt5?

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.

Is there a guide to use PySide or PyQt with pyxll?

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.

Why use Python/Qt for user interaction?

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.


1 Answers

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 QWidgets.

like image 51
Bakuriu Avatar answered Sep 21 '22 00:09

Bakuriu