source: trunk/doc/src/examples/menus.qdoc@ 561

Last change on this file since 561 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 10.2 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the documentation of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at qt-info@nokia.com.
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/*!
43 \example mainwindows/menus
44 \title Menus Example
45
46 The Menus example demonstrates how menus can be used in a main
47 window application.
48
49 A menu widget can be either a pull-down menu in a menu bar or a
50 standalone context menu. Pull-down menus are shown by the menu bar
51 when the user clicks on the respective item or presses the
52 specified shortcut key. Context menus are usually invoked by some
53 special keyboard key or by right-clicking.
54
55 \image menus-example.png
56
57 A menu consists of a list of \e action items. In applications,
58 many common commands can be invoked via menus, toolbar buttons as
59 well as keyboard shortcuts. Since the user expects the commands to
60 be performed in the same way, regardless of the user interface
61 used, it is useful to represent each command as an action.
62
63 The Menus example consists of one single class, \c MainWindow, derived
64 from the QMainWindow class. When choosing one of the
65 action items in our application, it will display the item's path
66 in its central widget.
67
68 \section1 MainWindow Class Definition
69
70 QMainWindow provides a main application window, with a menu bar,
71 tool bars, dock widgets and a status bar around a large central
72 widget.
73
74 \snippet examples/mainwindows/menus/mainwindow.h 0
75
76 In this example, we will see how to implement pull-down menus as
77 well as a context menu. In order to implement a custom context
78 menu we must reimplement QWidget's \l
79 {QWidget::}{contextMenuEvent()} function to receive the context
80 menu events for our main window.
81
82 \snippet examples/mainwindows/menus/mainwindow.h 1
83
84 We must also implement a collection of private slots to respond to
85 the user activating any of our menu entries. Note that these
86 slots are left out of this documentation since they are trivial,
87 i.e., most of them are only displaying the action's path in the
88 main window's central widget.
89
90 \snippet examples/mainwindows/menus/mainwindow.h 2
91
92 We have chosen to simplify the constructor by implementing two
93 private convenience functions to create the various actions, to
94 add them to menus and to insert the menus into our main window's
95 menu bar.
96
97 \snippet examples/mainwindows/menus/mainwindow.h 3
98
99 Finally, we declare the various menus and actions as well as a
100 simple information label in the application wide scope.
101
102 The QMenu class provides a menu widget for use in menu bars,
103 context menus, and other popup menus while the QAction class
104 provides an abstract user interface action that can be inserted
105 into widgets.
106
107 In some situations it is useful to group actions together, e.g.,
108 we have a \gui {Left Align} action, a \gui {Right Align} action, a
109 \gui {Justify} action, and a \gui {Center} action, and we want
110 only one of these actions to be active at any one time. One simple
111 way of achieving this is to group the actions together in an
112 action group using the QActionGroup class.
113
114 \section1 MainWindow Class Implementation
115
116 In the constructor, we start off by creating a regular QWidget and
117 make it our main window's central widget. Note that the main
118 window takes ownership of the widget pointer and deletes it at the
119 appropriate time.
120
121 \snippet examples/mainwindows/menus/mainwindow.cpp 0
122 \codeline
123 \snippet examples/mainwindows/menus/mainwindow.cpp 1
124
125 Then we create the information label as well as a top and bottom
126 filler that we add to a layout which we install on the central
127 widget. QMainWindow objects come with their own customized layout
128 and setting a layout on a the actual main window, or creating a
129 layout with a main window as a parent, is considered an error. You
130 should always set your own layout on the central widget instead.
131
132 \snippet examples/mainwindows/menus/mainwindow.cpp 2
133
134 To create the actions and menus we call our two convenience
135 functions: \c createActions() and \c createMenus(). We will get
136 back to these shortly.
137
138 QMainWindow's \l {QMainWindow::statusBar()}{statusBar()} function
139 returns the status bar for the main window (if the status bar does
140 not exist, this function will create and return an empty status
141 bar). We initialize the status bar and window title, resize the
142 window to an appropriate size as well as ensure that the main
143 window cannot be resized to a smaller size than the given
144 one.
145
146 Now, let's take a closer look at the \c createActions() convenience
147 function that creates the various actions:
148
149 \snippet examples/mainwindows/menus/mainwindow.cpp 4
150 \dots
151
152 A QAction object may contain an icon, a text, a shortcut, a status
153 tip, a "What's This?" text, and a tooltip. Most of these can be
154 set in the constructor, but they can also be set independently
155 using the provided convenience functions.
156
157 In the \c createActions() function, we first create a \c newAct
158 action. We make \gui Ctrl+N its shortcut using the
159 QAction::setShortcut() function, and we set its status tip using the
160 QAction::setStatusTip() function (the status tip is displayed on all
161 status bars provided by the action's top-level parent widget). We
162 also connect its \l {QAction::}{triggered()} signal to the \c
163 newFile() slot.
164
165 The rest of the actions are created in a similar manner. Please
166 see the source code for details.
167
168 \snippet examples/mainwindows/menus/mainwindow.cpp 7
169
170
171 Once we have created the \gui {Left Align}, \gui {Right Align},
172 \gui {Justify}, and a \gui {Center} actions, we can also create
173 the previously mentioned action group.
174
175 Each action is added to the group using QActionGroup's \l
176 {QActionGroup::}{addAction()} function. Note that an action also
177 can be added to a group by creating it with the group as its
178 parent. Since an action group is exclusive by default, only one of
179 the actions in the group is checked at any one time (this can be
180 altered using the QActionGroup::setExclusive() function).
181
182 When all the actions are created, we use the \c createMenus()
183 function to add the actions to the menus and to insert the menus
184 into the menu bar:
185
186 \snippet examples/mainwindows/menus/mainwindow.cpp 8
187
188 QMenuBar's \l {QMenuBar::addMenu()}{addMenu()} function appends a
189 new QMenu with the given title, to the menu bar (note that the
190 menu bar takes ownership of the menu). We use QWidget's \l
191 {QWidget::addAction()}{addAction()} function to add each action to
192 the corresponding menu.
193
194 Alternatively, the QMenu class provides several \l
195 {QMenu::addAction()}{addAction()} convenience functions that create
196 and add new actions from given texts and/or icons. You can also
197 provide a member that will automatically connect to the new
198 action's \l {QAction::triggered()}{triggered()} signal, and a
199 shortcut represented by a QKeySequence instance.
200
201 The QMenu::addSeparator() function creates and returns a new
202 separator action, i.e. an action for which QAction::isSeparator()
203 returns true, and adds the new action to the menu's list of
204 actions.
205
206 \snippet examples/mainwindows/menus/mainwindow.cpp 12
207
208 Note the \gui Format menu. First of all, it is added as a submenu
209 to the \gui Edit Menu using QMenu's \l
210 {QMenu::addMenu()}{addMenu()} function. Secondly, take a look at the
211 alignment actions: In the \c createActions() function we added the
212 \c leftAlignAct, \c rightAlignAct, \c justifyAct and \c centerAct
213 actions to an action group. Nevertheless, we must add each action
214 to the menu separately while the action group does its magic
215 behind the scene.
216
217 \snippet examples/mainwindows/menus/mainwindow.cpp 3
218
219 To provide a custom context menu, we must reimplement QWidget's \l
220 {QWidget::}{contextMenuEvent()} function to receive the widget's
221 context menu events (note that the default implementation simply
222 ignores these events).
223
224 Whenever we receive such an event, we create a menu containing the
225 \gui Cut, \gui Copy and \gui Paste actions. Context menus can be
226 executed either asynchronously using the \l {QMenu::}{popup()}
227 function or synchronously using the \l {QMenu::}{exec()}
228 function. In this example, we have chosen to show the menu using
229 its \l {QMenu::}{exec()} function. By passing the event's position
230 as argument we ensure that the context menu appears at the
231 expected position.
232*/
Note: See TracBrowser for help on using the repository browser.