|  | Home · Examples

# Qt Tutorial 3 - Family Values

[Previous: Qt Tutorial 2 - Calling it Quits][Qt Tutorial][Next: Qt Tutorial 4 - Let There Be Widgets]

This example shows how to create parent and child widgets.

We'll keep it simple and use just a single parent and a lone child.
The following code example is written in c++.

    #include <QApplication>
    #include <QFont>
    #include <QPushButton>

    #include <QWidget>

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);

        QWidget window;

        window.resize(200, 120);

        QPushButton quit("Quit", &window);

        quit.setFont(QFont("Times", 18, QFont::Bold));

        quit.setGeometry(10, 40, 180, 40);

        QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));

        window.show();

        return app.exec();
    }

## Line by Line Walkthrough

The following code example is written in c++.

    #include <QWidget>

We add an include of <QWidget> to get the base widget class we'll use.
The following code example is written in c++.

        QWidget window;

Here we simply create a plain widget object. The QWidget class is the base class of all user interface objects. The widget is the atom of the user interface: It receives mouse, keyboard and other events from the window system, and paints a representation of itself on the screen. A widget is clipped by its parent and by the widgets in front of it.

A widget that isn't embedded in a parent widget, like this particular widget, is called a window. Usually, windows have their own window frame and taskbar entry, provided by the window system. A widget without a parent widget is always an independent window. Its initial position on the screen is controlled by the window system.
The following code example is written in c++.

        window.resize(200, 120);

We set the window's width to 200 pixels and its height to 120 pixels.
The following code example is written in c++.

        QPushButton quit("Quit", &window);

A child is born. This QPushButton is created with a parent widget (`window`). A child widget is always displayed within its parent's area. When displayed, it is clipped by its parent's bounds. By default, it is rooted at the top-left corner of its parent, at position (0, 0).
The following code example is written in c++.

        quit.setGeometry(10, 40, 180, 40);

The QWidget::setGeometry() function takes four arguments: The first two arguments are the x and y coordinates of the button's top-left corner. The coordinates are relative to the parent widget. The last two arguments are the button's width and height. The result is a button that extends from position (10, 40) to position (190, 80).
The following code example is written in c++.

        window.show();

When a parent widget is shown, it will call show for all its children (except those that were explicitly hidden using QWidget::hide()).

### On being mindful of the order of things

Tutorial readers who have already studied QObject, will recall that when the destructor of a QObject is called, if the QObject has children, its destructor automatically calls the destructor of each child. Thus it might appear that the destructor of QPushButton `quit` will be called twice at the end of main(), once when its parent, `window`, goes out of scope and the destructor deletes `quit` because it is a child, and a second time when `quit` itself goes out of scope. But there is no need to worry in this case; the code is correct. However, there is a case where one must be mindful of the order of destruction of objects on the stack. For an explanation, see this note on the order of construction/destruction of QObjects.

## Running the Application

The button no longer fills the entire window. Instead, it stays at position (10, 40) within the window and with a size of (180, 40), because of the QWidget::setGeometry() call.

## Exercises

Try resizing the window. How does the button change? What happens to the button's height if you run the program with a bigger font? What happens if you try to make the window really small?