1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
|
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Creator documentation.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
**
****************************************************************************/
/*!
\page first-plugin.html
\title Creating Your First Plugin
This section describes how to create a \QC plugin by using the plugin
template provided by \QC, and get the first impression of what a plugin
consists of and what its general structure is.
\section1 Creating a Plugin Project
\QC comes with a wizard for \QC plugins, that creates a runable, \e minimal
plugin for you. We strongly suggest that you use two different \QC instances
for developing and testing your plugin with. Otherwise your plugin will also
be loaded in your development environment, which can make that unstable
while your plugin is still unstable. You can just create a copy of your \QC
build and use one for actually developing, and the other for testing your
plugin with.
You need to make sure that you use the same \QC version that you want to
develop for to create the plugin. Because of the \l{Binary and Source
Compatibility} rules of \QC, the \QC plugin wizard creates a plugin that
might only compile and run with the same \QC version that it was created
with.
\list 1
\li Select \uicontrol File > \uicontrol {New File or Project} >
\uicontrol Library > \uicontrol {Qt Creator Plugin} >
\uicontrol Choose.
\image firstplugin-wizard.png "Choose the \QC Plugin Wizard"
The \uicontrol{Introduction and Project Location} dialog opens.
\image firstplugin-nameandpath.png "Choose Name and Place of the Project"
\li Give your project a name and specify in which path this project will
be created. The actual plugin's name can be different from the
project name. You will choose that name later in the wizard.
Continue to the next page.
The \uicontrol {Kit Selection} dialog opens.
\image firstplugin-kitselection.png "Choose the kit to build and run your project with"
\li Select the \l{glossary-buildandrun-kit}{kit} to build and run your
project with. For a \QC plugin this needs to be a kit with
\uicontrol Desktop device type, and a Qt version that is compatible
with the Qt version that your \QC was built with (in the best case
the exact same build). If you use an incompatible Qt version to
build your plugin, you will get errors while \QC tries to load your
plugin. Continue to the next page.
The \uicontrol {Plugin Information} dialog opens.
\image firstplugin-pluginsetup.png "Specify Your Plugin Details"
\li In the \uicontrol {Plugin name} field, type \uicontrol Example. The
name of the plugin is used as its identifier, and also is the base
for the file names and classes in the code.
\li The values of the following fields are mainly informational, and
are shown in the detailed view in \QC's plugin overview
(\uicontrol Help > \uicontrol {About Plugins}, or
\uicontrol {Qt Creator} > \uicontrol {About Plugins} on Mac).
\list
\li \uicontrol {Vendor name} is a short one-word name of the
company or organization that created the plugin. This is
also used for the path name where the plugin will be
deployed to.
\li \uicontrol Copyright is a one-line, short copyright string.
\li \uicontrol License is a license text.
\li \uicontrol{Description} is a short description of what the
plugin does.
\li \uicontrol URL is a website where the user can find more
information about the plugin and/or organization providing
it.
\endlist
\li Set the \uicontrol {Qt Creator sources} and
\uicontrol{Qt Creator build} fields to the source and build
directory of the \QC instance you want to use to test your plugin
with, respectively. If you don't do that correctly you will get
compile errors for your plugin, and your plugin might not show up in
\QC at all.
\li In the \uicontrol {Deploy into} list, select
\uicontrol {Qt Creator build}. This sets your \c {.pro} file up to
deploy your plugin directly into your \QC build's plugin directory
(requires you to have write permissions there). The other option,
\uicontrol {Local user settings}, sets your \c {.pro} file up to
deploy your plugin into \QC's user plugin path (for example
\c {~/.config/QtProject/qtcreator/plugins} on Unix systems). We
choose \uicontrol {Qt Creator build} because we use a self-compiled
\QC, and want the plugin to be only loaded by that \QC
instance. Continue to the next page.
The \uicontrol {Project Management} dialog opens.
\image firstplugin-summary.png "Summary of Created Files"
\li Review the files that will be created, choose a version control
system that \QC should use for your project (always a good idea!),
and finish the wizard.
\endlist
\section1 Building and Running the Plugin
If you passed the correct \QC source and build paths in the project wizard,
your plugin should just build fine when pressing the build button. When you
try to run your project, \QC will ask you for the executable to run and you
are presented the following dialog:
\image firstplugin-runsettings.png "Specify the Executable to Run"
Select the path to the \QC executable from the build that you specified in
the \uicontrol {Qt Creator build} setting in the project wizard and click
\uicontrol OK. \QC starts up, and you can verify that your plugin
successfully loaded by looking for a menu entry \uicontrol Tools >
\uicontrol Example and by looking for the plugin in the
\uicontrol {About Plugins} dialog.
\image firstplugin-menuitem.png "Menu Registered by the Plugin"
\section1 File Structure
The plugin wizard creates a set of basic files that a plugin needs or should
have. We will have a look at some of them in detail in the following
sections, here is a short overview:
\table
\header
\li File
\li Role
\row
\li \c {Example.json.in}
\li Plugin meta data template. QMake creates an \c {Example.json}
from this file, which is compiled into the plugin as meta data.
The meta data is read by \QC to find out about the plugin.
\row
\li \c {example.pro}
\li Project file, used by QMake to generate a Makefile that then is used to
build the plugin.
\row
\li \c {example_global.h}
\li Contains macro definitions that are useful when this plugin should export
symbols to other plugins.
\row
\li \c {exampleconstants.h}
\li Header defining constants used by the plugin code.
\row
\li \c{exampleplugin.h/.cpp}
\li C++ header and source files that define the plugin class that will be
instanciated and run by \QC's plugin manager.
\endtable
\section1 qmake Project
The qmake project file \c {example.pro} defines how your plugin should be
compiled. \QC plugins need to have a specific setup there, in addition to
telling qmake which files need to be compiled (or handled by \c moc or
\c uic). Let us have a look at what the project wizard generated for you in
detail.
\snippet exampleplugin/example.pro 1
The first section of the .pro file lets the compiler pass an
\c EXAMPLE_LIBRARY define to the compiled code, which is used in the
\c {example_global.h} header, but is not really of interest for now. You
should not need to change that section of the \c {.pro} file.
\snippet exampleplugin/example.pro 2
This section tells qmake about the files of your project that it should let
compile or otherwise handle. You need to expand that section with any files
you add to the project.
\snippet exampleplugin/example.pro 3
To compile and deploy your plugin, the project needs access to the \QC
sources and build. This section contains the logic that looks for the
information about the location of the sources and build in the
\c {QTC_SOURCE} and \c {QTC_BUILD} environment variables. If these are not
defined, it uses the defaults you set in the project wizard.
So, if someone else opens your plugin project on their machine, they do not
need to edit the .pro file, but instead they should set the \c {QTC_SOURCE}
and \c {QTC_BUILD} environment variables correctly for the plugin's build
environment.
You should not need to change this section, except perhaps to adapt the
defaults.
\snippet exampleplugin/example.pro 4
\QC plugins can either be installed into the \QC installation's plugin
directory (requires write access there), or to a user specific plugin
directory. The \c USE_USER_DESTDIR switch in the .pro file defines which
method is used for building the plugin (which is independent from what you
can later use for distributing your plugin to other users).
\snippet exampleplugin/example.pro 5
This section defines the name and dependencies of your plugin. The
\c {QTC_PLUGIN_NAME} variable defines the name of your plugin, and the name
of the dynamic library that is created for it. The \c {QTC_LIB_DEPENDS}
variable is a list of library names of the \QC utility libraries that your
plugin depends on. Typical values would be \c aggregation,
\c extensionsystem and \c utils. The \c {QTC_PLUGIN_DEPENDS} variable
defines the \QC plugins that your plugin depends on. Almost all \QC plugins
will depend on the \c coreplugin. The \c {QTC_PLUGIN_RECOMMENDS} variable
defines the \QC plugins that your plugin optionally depends on. For more
information, see \l{Optional Dependencies}.
\snippet exampleplugin/example.pro 6
The included file \c{qtcreatorplugin.pri} makes sure that you build a plugin
that is suitable for use in \QC, by using the information you gave above.
For more information about qmake, and writing \c {.pro} files in general,
see the \l{qmake Manual}.
\section1 Plugin Meta Data Template
The \c {.json} file is a JSON file that contains information that is needed
by the plugin manager to find your plugin and resolve its dependencies
before actually loading your plugin's library file. We will only have a
short look at it here. For more information, see \l{Plugin Meta Data}.
The wizard doesn't actually create a .json file directly, but instead a
\c {.json.in} file. qmake uses this to generate the actual plugin .json
meta data file, replacing variables like \c {QTCREATOR_VERSION} with their
actual values. Therefore you need to escape all backslashes and quotes in
the \c {.json.in} file (i.e. you need to write \c {\} to get a backslash
and \c{\"} to get a quote in the generated plugin JSON meta data).
\snippet exampleplugin/Example.json.in 1
The first items in the meta data that is created by the wizard define the
name of your plugin, its version, and with what version of this plugin the
current version is binary compatible with.
\snippet exampleplugin/Example.json.in 2
After that you'll find the information about the plugin that you gave in the
project wizard.
\snippet exampleplugin/Example.json.in 3
The \c {$$dependencyList} variable is automatically replaced by the
dependency information in \c {QTC_PLUGIN_DEPENDS} and
\c {QTC_PLUGIN_RECOMMENDS} from your plugin's \c {.pro} file.
\section1 Plugin Class
The files \c {exampleplugin.h} and \c {exampleplugin.cpp} define the plugin
implementation of your little plugin. We'll concentrate on some highlights
here, and give pointers to more detailed information for the various parts.
\section2 Header File
The header file \c {exampleplugin.h} defines the interface of the plugin
class.
\snippet exampleplugin/exampleplugin.h namespaces
The plugin is defined in a \c {Example::Internal} namespace, which conforms
to the coding rules for \l{coding-rules-namespacing}{namespacing}
in \QC sources.
\snippet exampleplugin/exampleplugin.h base class
All \QC plugins must be derived from \l{ExtensionSystem::IPlugin} and
are QObjects. The \c {Q_PLUGIN_METADATA} macro is necessary to create a
valid Qt plugin. The \c IID given in the macro must be
\c {org.qt-project.Qt.QtCreatorPlugin}, to identify it as a \QC plugin, and
\c FILE must point to the plugin's meta data file as described in
\l{Plugin Meta Data}.
\snippet exampleplugin/exampleplugin.h plugin functions
The base class defines basic functions that are called during the life cycle
of a plugin, which are here implemented for your new plugin. These functions
and their roles are described in detail in \l{The Plugin Life Cycle}.
\snippet exampleplugin/exampleplugin.h slot
The plugin has an additional custom slot, that is used to pop up a dialog
when the user chooses the menu item that this plugin adds.
\section2 Source File
The source file contains the actual implementation of the plugin, which
registers a new menu and menu item, and opens a message box when that item
is triggered.
All the necessary header files from the plugin code itself, from the \c
Core plugin, and from Qt are included in the beginning of the file. The
setup of the menu and menu item is done in the plugin's \c initialize
function, which is the first thing called after the plugin constructor. In
that function, the plugin can be sure that the basic setup of plugin's that
it depends on has been done, for example the Core plugin's \c ActionManager
instance has been created.
For more information about implementing the plugin interface, see the
\l{ExtensionSystem::IPlugin} API documentation and \l{Plugin Life Cycle}.
\snippet exampleplugin/exampleplugin.cpp add action
This part of the code creates a new \c QAction, registers it as a new
\c Command in the action manager, and connects it to the plugin's slot. The
action manager provides a central place where the user can assign and change
keyboard shortcuts, and manages cases where for example a menu item should
be directed to different plugins under different circumstances, as well as a
few other things. This is described in more detail in
\l{Menus and Menu Items}.
\snippet exampleplugin/exampleplugin.cpp add menu
Here a new menu item is created, the created command added to it, and the
menu added to the \uicontrol Tools menu in the menu bar. Again, this is
covered in more detail in \l{Menus and Menu Items}.
\snippet exampleplugin/exampleplugin.cpp slot implementation
This part defines the code that is called when the menu item is triggered.
It uses the Qt API to open a message box that displays informative text and
an \uicontrol OK button.
*/
|