The central area of a QMainWindow can be occupied by any kind of widget. Here's an overview of the possibilities:
A standard widget like QTable or QTextEdit can be used as a central widget. In this case, the application's functionality, such as loading and saving files, must be implemented elsewhere (for example, in a QMainWindow subclass).
Specialized applications often need to show data in a custom widget. For example, an icon editor program would have an IconEditor widget as its central widget. Chapter 5 explains how to write custom widgets in Qt.
Sometimes the application's central area is occupied by many widgets. This can be done by using a QWidget as the parent of all the other widgets, and using layout managers to size and position the child widgets.
Another way of using multiple widgets together is to use a QSplitter. The QSplitter arranges its child widgets side by side like a QHBox, or in a column like a QVBox, with splitter handles to give some sizing control to the user. Splitters can contain all kinds of widgets, including other splitters.
If the application uses MDI, the central area is occupied by a QWorkspace widget, and each of the MDI windows is a child of that widget.
Layouts, splitters, and MDI workspaces can be used in combination with standard Qt widgets or with custom widgets. Chapter 6 covers these classes in depth.
For the Spreadsheet application, a QTable subclass is used as the central widget. The QTable class already provides most of the spreadsheet capability we need, but it doesn't understand spreadsheet formulas like "=A1+A2+A3", and it doesn't support clipboard operations. We will implement this missing functionality in the Spreadsheet class, which inherits from QTable.