0
|
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 |
** No Commercial Usage
|
|
11 |
** This file contains pre-release code and may not be distributed.
|
|
12 |
** You may use this file in accordance with the terms and conditions
|
|
13 |
** contained in the Technology Preview License Agreement accompanying
|
|
14 |
** this package.
|
|
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 |
** If you have questions regarding the use of this file, please contact
|
|
29 |
** Nokia at qt-info@nokia.com.
|
|
30 |
**
|
|
31 |
**
|
|
32 |
**
|
|
33 |
**
|
|
34 |
**
|
|
35 |
**
|
|
36 |
**
|
|
37 |
**
|
|
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 |
*/
|