
Time for action – filling in the central widget
Add two labels in the main window area—one at the top for the first player name and one at the bottom of the form for the second player name—and then change their objectName
property to player1
and player2
, respectively. Clear their text property so that they don't display anything. Then, drag Widget from the widget box, drop it between the two labels' and set its object name to gameBoard
. Invoke the context menu on the widget that you just dropped and choose Promote to. This allows us to substitute a widget in the form with another class; in our case, we will want to replace the empty widget with our game board. Fill the dialog that has just appeared with the values shown in the following figure:

Then, click on the button labeled Add and then Promote to close the dialog and confirm the promotion. You will not notice any changes in the form because the replacement only takes place during compilation. Now, apply a vertical layout on the form so that the labels and the empty widget snap into place.
What just happened?
Not all widget types are directly available in the form designer. Sometimes, we need to use widget classes that will only be created in the project that is being built. The simplest way to be able to put custom widgets on a form is to ask the designer to replace class names with some of the objects when C++ code for the form is to be generated. By promoting an object to a different class, we saved a lot of work trying to otherwise fit our game board into the user interface.