source: trunk/doc/src/examples/taskmenuextension.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: 20.1 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 designer/taskmenuextension
44 \title Task Menu Extension Example
45
46 The Task Menu Extension example shows how to create a custom
47 widget plugin for \l {Qt Designer Manual}{\QD}, and how to to use
48 the QDesignerTaskMenuExtension class to provide custom task menu
49 entries associated with the plugin.
50
51 \image taskmenuextension-example-faded.png
52
53 To provide a custom widget that can be used with \QD, we need to
54 supply a self-contained implementation. In this example we use a
55 custom widget designed to show the task menu extension feature:
56 The TicTacToe widget.
57
58 An extension is an object which modifies the behavior of \QD. The
59 QDesignerTaskMenuExtension can provide custom task menu entries
60 when a widget with this extension is selected.
61
62 There are four available types of extensions in \QD:
63
64 \list
65 \o QDesignerContainerExtension provides an extension that allows
66 you to add (and delete) pages to a multi-page container plugin
67 in \QD.
68 \o QDesignerMemberSheetExtension provides an extension that allows
69 you to manipulate a widget's member functions which is displayed
70 when configuring connections using Qt Designer's mode for editing
71 signals and slots.
72 \o QDesignerPropertySheetExtension provides an extension that
73 allows you to manipulate a widget's properties which is displayed
74 in Qt Designer's property editor.
75 \o QDesignerTaskMenuExtension provides an extension that allows
76 you to add custom menu entries to \QD's task menu.
77 \endlist
78
79 You can use all the extensions following the same pattern as in
80 this example, only replacing the respective extension base
81 class. For more information, see the \l {QtDesigner Module}.
82
83 The Task Menu Extension example consists of five classes:
84
85 \list
86 \o \c TicTacToe is a custom widget that lets the user play
87 the Tic-Tac-Toe game.
88 \o \c TicTacToePlugin exposes the \c TicTacToe class to \QD.
89 \o \c TicTacToeTaskMenuFactory creates a \c TicTacToeTaskMenu object.
90 \o \c TicTacToeTaskMenu provides the task menu extension, i.e the
91 plugin's associated task menu entries.
92 \o \c TicTacToeDialog lets the user modify the state of a
93 Tic-Tac-Toe plugin loaded into \QD.
94 \endlist
95
96 The project file for custom widget plugins needs some additional
97 information to ensure that they will work within \QD. For example,
98 custom widget plugins rely on components supplied with \QD, and
99 this must be specified in the project file that we use. We will
100 first take a look at the plugin's project file.
101
102 Then we will continue by reviewing the \c TicTacToePlugin class,
103 and take a look at the \c TicTacToeTaskMenuFactory and \c
104 TicTacToeTaskMenu classes. Finally, we will review the \c
105 TicTacToeDialog class before we take a quick look at the \c
106 TicTacToe widget's class definition.
107
108 \section1 The Project File: taskmenuextension.pro
109
110 The project file must contain some additional information to
111 ensure that the plugin will work as expected:
112
113 \snippet examples/designer/taskmenuextension/taskmenuextension.pro 0
114 \snippet examples/designer/taskmenuextension/taskmenuextension.pro 1
115
116 The \c TEMPLATE variable's value makes \c qmake create the custom
117 widget as a library. Later, we will ensure that the widget will be
118 recognized as a plugin by Qt by using the Q_EXPORT_PLUGIN2() macro to
119 export the relevant widget information.
120
121 The \c CONFIG variable contains two values, \c designer and \c
122 plugin:
123
124 \list
125 \o \c designer: Since custom widgets plugins rely on components
126 supplied with \QD, this value ensures that our plugin links against
127 \QD's library (\c libQtDesigner.so).
128
129 \o \c plugin: We also need to ensure that \c qmake considers the
130 custom widget a \e plugin library.
131 \endlist
132
133 When Qt is configured to build in both debug and release modes,
134 \QD will be built in release mode. When this occurs, it is
135 necessary to ensure that plugins are also built in release
136 mode. For that reason we add the \c debug_and_release value to
137 the \c CONFIG variable. Otherwise, if a plugin is built in a mode
138 that is incompatible with \QD, it won't be loaded and
139 installed.
140
141 The header and source files for the widget are declared in the
142 usual way:
143
144 \snippet examples/designer/taskmenuextension/taskmenuextension.pro 2
145
146 We provide an implementation of the plugin interface so that \QD
147 can use the custom widget. In this particular example we also
148 provide implementations of the task menu extension and the
149 extension factory as well as a dialog implementation.
150
151 It is important to ensure that the plugin is installed in a
152 location that is searched by \QD. We do this by specifying a
153 target path for the project and adding it to the list of items to
154 install:
155
156 \snippet doc/src/snippets/code/doc_src_examples_taskmenuextension.qdoc 0
157
158 The task menu extension is created as a library, and will be
159 installed alongside the other \QD plugins when the project is
160 installed (using \c{make install} or an equivalent installation
161 procedure).
162
163 Note that if you want the plugins to appear in a Visual Studio
164 integration, the plugins must be built in release mode and their
165 libraries must be copied into the plugin directory in the install
166 path of the integration (for an example, see \c {C:/program
167 files/trolltech as/visual studio integration/plugins}).
168
169 For more information about plugins, see the \l {How to Create Qt
170 Plugins} documentation.
171
172 \section1 TicTacToePlugin Class Definition
173
174 The \c TicTacToePlugin class exposes \c the TicTacToe class to
175 \QD. Its definition is equivalent to the \l
176 {designer/customwidgetplugin}{Custom Widget Plugin} example's
177 plugin class which is explained in detail. The only part of the
178 class definition that is specific to this particular custom widget
179 is the class name:
180
181 \snippet examples/designer/taskmenuextension/tictactoeplugin.h 0
182
183 The plugin class provides \QD with basic information about our
184 plugin, such as its class name and its include file. Furthermore
185 it knows how to create instances of the \c TicTacToe widget.
186 TicTacToePlugin also defines the \l
187 {QDesignerCustomWidgetInterface::initialize()}{initialize()}
188 function which is called after the plugin is loaded into \QD. The
189 function's QDesignerFormEditorInterface parameter provides the
190 plugin with a gateway to all of \QD's API's.
191
192 The \c TicTacToePlugin class inherits from both QObject and
193 QDesignerCustomWidgetInterface. It is important to remember, when
194 using multiple inheritance, to ensure that all the interfaces
195 (i.e. the classes that doesn't inherit Q_OBJECT) are made known to
196 the meta object system using the Q_INTERFACES() macro. This
197 enables \QD to use \l qobject_cast() to query for supported
198 interfaces using nothing but a QObject pointer.
199
200 \section1 TicTacToePlugin Class Implementation
201
202 The TicTacToePlugin class implementation is in most parts
203 equivalent to the \l {designer/customwidgetplugin}{Custom Widget
204 Plugin} example's plugin class:
205
206 \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 0
207
208 The only function that differs significantly is the initialize()
209 function:
210
211 \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 1
212
213 The \c initialize() function takes a QDesignerFormEditorInterface
214 object as argument. The QDesignerFormEditorInterface class
215 provides access to Qt Designer's components.
216
217 In \QD you can create two kinds of plugins: custom widget plugins
218 and tool plugins. QDesignerFormEditorInterface provides access to
219 all the \QD components that you normally need to create a tool
220 plugin: the extension manager, the object inspector, the property
221 editor and the widget box. Custom widget plugins have access to
222 the same components.
223
224 \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 2
225
226 When creating extensions associated with custom widget plugins, we
227 need to access \QD's current extension manager which we retrieve
228 from the QDesignerFormEditorInterface parameter.
229
230 \QD's QDesignerFormEditorInterface holds information about all Qt
231 Designer's components: The action editor, the object inspector,
232 the property editor, the widget box, and the extension and form
233 window managers.
234
235 The QExtensionManager class provides extension management
236 facilities for \QD. Using \QD's current extension manager you can
237 retrieve the extension for a given object. You can also register
238 and unregister an extension for a given object. Remember that an
239 extension is an object which modifies the behavior of \QD.
240
241 When registrering an extension, it is actually the associated
242 extension factory that is registered. In \QD, extension factories
243 are used to look up and create named extensions as they are
244 required. So, in this example, the task menu extension itself is
245 not created until a task menu is requested by the user.
246
247 \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 3
248
249 We create a \c TicTacToeTaskMenuFactory object that we register
250 using \QD's current \l {QExtensionManager}{extension manager}
251 retrieved from the QDesignerFormEditorInterface parameter. The
252 first argument is the newly created factory and the second
253 argument is an extension identifier which is a string. The \c
254 Q_TYPEID() macro simply converts the string into a QLatin1String.
255
256 The \c TicTacToeTaskMenuFactory class is a subclass of
257 QExtensionFactory. When the user request a task menu by clicking
258 the right mouse button over a widget with the specified task menu
259 extension, \QD's extension manager will run through all its
260 registered factories invoking the first one that is able to create
261 a task menu extension for the selected widget. This factory will
262 in turn create a \c TicTacToeTaskMenu object (the extension).
263
264 We omit to reimplement the
265 QDesignerCustomWidgetInterface::domXml() function (which include
266 default settings for the widget in the standard XML format used by
267 Qt Designer), since no default values are necessary.
268
269 \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 4
270
271 Finally, we use the Q_EXPORT_PLUGIN2() macro to export the
272 TicTacToePlugin class for use with Qt's plugin handling classes:
273 This macro ensures that \QD can access and construct the custom
274 widget. Without this macro, there is no way for \QD to use the
275 widget.
276
277 \section1 TicTacToeTaskMenuFactory Class Definition
278
279 The \c TicTacToeTaskMenuFactory class inherits QExtensionFactory
280 which provides a standard extension factory for \QD.
281
282 \snippet examples/designer/taskmenuextension/tictactoetaskmenu.h 1
283
284 The subclass's purpose is to reimplement the
285 QExtensionFactory::createExtension() function, making it able to
286 create a \c TicTacToe task menu extension.
287
288 \section1 TicTacToeTaskMenuFactory Class Implementation
289
290 The class constructor simply calls the QExtensionFactory base
291 class constructor:
292
293 \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 4
294
295 As described above, the factory is invoked when the user request a
296 task menu by clicking the right mouse button over a widget with
297 the specified task menu extension in \QD.
298
299 \QD's behavior is the same whether the requested extension is
300 associated with a container, a member sheet, a property sheet or a
301 task menu: Its extension manager runs through all its registered
302 extension factories calling \c createExtension() for each until
303 one responds by creating the requested extension.
304
305 \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 5
306
307 So the first thing we do in \c
308 TicTacToeTaskMenuFactory::createExtension() is to check if the
309 requested extension is a task menu extension. If it is, and the
310 widget requesting it is a \c TicTacToe widget, we create and
311 return a \c TicTacToeTaskMenu object. Otherwise, we simply return
312 a null pointer, allowing \QD's extension manager to continue its
313 search through the registered factories.
314
315
316 \section1 TicTacToeTaskMenu Class Definition
317
318 \image taskmenuextension-menu.png
319
320 The \c TicTacToeTaskMenu class inherits QDesignerTaskMenuExtension
321 which allows you to add custom entries (in the form of QActions)
322 to the task menu in \QD.
323
324 \snippet examples/designer/taskmenuextension/tictactoetaskmenu.h 0
325
326 We reimplement the \c preferredEditAction() and \c taskActions()
327 functions. Note that we implement a constructor that takes \e two
328 arguments: the parent widget, and the \c TicTacToe widget for
329 which the task menu is requested.
330
331 In addition we declare the private \c editState() slot, our custom
332 \c editStateAction and a private pointer to the \c TicTacToe
333 widget which state we want to modify.
334
335 \section1 TicTacToeTaskMenu Class Implementation
336
337 \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 0
338
339 In the constructor we first save the reference to the \c TicTacToe
340 widget sent as parameter, i.e the widget which state we want to
341 modify. We will need this later when our custom action is
342 invoked. We also create our custom \c editStateAction and connect
343 it to the \c editState() slot.
344
345 \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 1
346
347 The \c editState() slot is called whenever the user chooses the
348 \gui {Edit State...} option in a \c TicTacToe widget's task menu. The
349 slot creates a \c TicTacToeDialog presenting the current state of
350 the widget, and allowing the user to edit its state by playing the
351 game.
352
353 \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 2
354
355 We reimplement the \c preferredEditAction() function to return our
356 custom \c editStateAction as the action that should be invoked
357 when selecting a \c TicTacToe widget and pressing \key F2 .
358
359 \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 3
360
361 We reimplement the \c taskActions() function to return a list of
362 our custom actions making these appear on top of the default menu
363 entries in a \c TicTacToe widget's task menu.
364
365 \section1 TicTacToeDialog Class Definition
366
367 \image taskmenuextension-dialog.png
368
369 The \c TicTacToeDialog class inherits QDialog. The dialog lets the
370 user modify the state of the currently selected Tic-Tac-Toe
371 plugin.
372
373 \snippet examples/designer/taskmenuextension/tictactoedialog.h 0
374
375 We reimplement the \c sizeHint() function. We also declare two
376 private slots: \c resetState() and \c saveState(). In addition to
377 the dialog's buttons and layouts we declare two \c TicTacToe
378 pointers, one to the widget the user can interact with and the
379 other to the original custom widget plugin which state the user
380 wants to edit.
381
382 \section1 TicTacToeDialog Class Implementation
383
384 \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 0
385
386 In the constructor we first save the reference to the TicTacToe
387 widget sent as parameter, i.e the widget which state the user want
388 to modify. Then we create a new \c TicTacToe widget, and set its
389 state to be equivalent to the parameter widget's state.
390
391 Finally, we create the dialog's buttons and layout.
392
393 \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 1
394
395 We reimplement the \c sizeHint() function to ensure that the
396 dialog is given a reasonable size.
397
398 \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 2
399
400 The \c resetState() slot is called whenever the user press the
401 \gui Reset button. The only thing we do is to call the \c
402 clearBoard() function for the editor widget, i.e. the \c TicTacToe
403 widget we created in the dialog's constructor.
404
405 \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 3
406
407 The \c saveState() slot is called whenever the user press the \gui
408 OK button, and transfers the state of the editor widget to the
409 widget which state we want to modify. In order to make the change
410 of state visible to \QD we need to set the latter widget's state
411 property using the QDesignerFormWindowInterface class.
412
413 QDesignerFormWindowInterface provides you with information about
414 the associated form window as well as allowing you to alter its
415 properties. The interface is not intended to be instantiated
416 directly, but to provide access to Qt Designer's current form
417 windows controlled by Qt Designer's form window manager.
418
419 If you are looking for the form window containing a specific
420 widget, you can use the static
421 QDesignerFormWindowInterface::findFormWindow() function:
422
423 \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 4
424
425 After retrieving the form window of the widget (which state we
426 want to modify), we use the QDesignerFormWindowInterface::cursor()
427 function to retrieve the form window's cursor.
428
429 The QDesignerFormWindowCursorInterface class provides an interface
430 to the form window's text cursor. Once we have cursor, we can
431 finally set the state property using the
432 QDesignerFormWindowCursorInterface::setProperty() function.
433
434 \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 5
435
436 In the end we call the QEvent::accept() function which sets the
437 accept flag of the event object. Setting the \c accept parameter
438 indicates that the event receiver wants the event. Unwanted events
439 might be propagated to the parent widget.
440
441 \section1 TicTacToe Class Definition
442
443 The \c TicTacToe class is a custom widget that lets the user play
444 the Tic-Tac-Toe game.
445
446 \snippet examples/designer/taskmenuextension/tictactoe.h 0
447
448 The main details to observe in the \c TicTacToe class defintion is
449 the declaration of the \c state property and its \c state() and \c
450 setState() functions.
451
452 We need to declare the \c TicTacToe widget's state as a property
453 to make it visible to \QD; allowing \QD to manage it in the same
454 way it manages the properties the \c TicTacToe widget inherits
455 from QWidget and QObject, for example featuring the property
456 editor.
457*/
Note: See TracBrowser for help on using the repository browser.