Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qt_add_qml_module.qdoc
Go to the documentation of this file.
1
// Copyright (C) 2021 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
3
4
/*!
5
\page qt-add-qml-module.html
6
\ingroup cmake-commands-qtqml
7
8
\title qt_add_qml_module
9
\keyword qt6_add_qml_module
10
11
\brief Defines a QML module.
12
13
\cmakecommandsince 6.2
14
15
\include cmake-find-package-qml.qdocinc
16
17
\section1 Synopsis
18
19
\badcode
20
qt_add_qml_module(
21
target
22
URI uri
23
[VERSION version]
24
[PAST_MAJOR_VERSIONS ...]
25
[STATIC | SHARED]
26
[PLUGIN_TARGET plugin_target]
27
[OUTPUT_DIRECTORY output_dir]
28
[RESOURCE_PREFIX resource_prefix]
29
[CLASS_NAME class_name]
30
[TYPEINFO typeinfo]
31
[IMPORTS ...]
32
[OPTIONAL_IMPORTS ...]
33
[DEFAULT_IMPORTS ...]
34
[DEPENDENCIES ...]
35
[IMPORT_PATH ...]
36
[SOURCES ...]
37
[QML_FILES ...]
38
[RESOURCES ...]
39
[OUTPUT_TARGETS out_targets_var]
40
[DESIGNER_SUPPORTED]
41
[FOLLOW_FOREIGN_VERSIONING]
42
[NAMESPACE namespace]
43
[NO_PLUGIN]
44
[NO_PLUGIN_OPTIONAL]
45
[NO_CREATE_PLUGIN_TARGET]
46
[NO_GENERATE_PLUGIN_SOURCE]
47
[NO_GENERATE_QMLTYPES]
48
[NO_GENERATE_QMLDIR]
49
[NO_GENERATE_EXTRA_QMLDIRS]
50
[NO_LINT]
51
[NO_CACHEGEN]
52
[NO_RESOURCE_TARGET_PATH]
53
[NO_IMPORT_SCAN]
54
[DISCARD_QML_CONTENTS]
55
[ENABLE_TYPE_COMPILER]
56
[TYPE_COMPILER_NAMESPACE namespace]
57
[QMLTC_EXPORT_DIRECTIVE export_macro]
58
[QMLTC_EXPORT_FILE_NAME header_defining_export_macro]
59
60
)
61
62
\endcode
63
64
\versionlessCMakeCommandsNote qt6_add_qml_module()
65
66
See \l {Building a QML application} and \l {Building a reusable QML module}
67
for examples that define QML modules.
68
69
\section1 Description
70
71
This command defines a QML module that can consist of C++ sources, \c{.qml}
72
files, or both. It ensures that essential module details are provided and that
73
they are consistent. It also sets up and coordinates things like cached
74
compilation of \c{.qml} sources, resource embedding, linting checks, and
75
auto-generation of some key module files.
76
77
\section2 Target Structure
78
79
A QML module can be structured in a few different ways. The following scenarios
80
are the typical arrangements:
81
82
\section3 Separate backing and plugin targets
83
84
This is the recommended arrangement for most QML modules. All of the module's
85
functionality is implemented in the \e backing target, which is given as the
86
first command argument. C++ sources, \c{.qml} files, and resources should all
87
be added to the backing target. The backing target is a library that should be
88
installed in the same location as any other library defined by the project.
89
90
The source directory structure under which the backing target is created should
91
match the target path of the QML module (the target path is the module's URI
92
with dots replaced by forward slashes). If the source directory structure
93
doesn't match the target path, \c{qt_add_qml_module()} will issue a warning.
94
95
The following example shows a suitable source directory structure for a QML
96
module with a URI of \c{MyThings.Panels}. The call to \c{qt_add_qml_module()}
97
would be in the \c{CMakeLists.txt} file shown.
98
99
\badcode
100
src
101
+-- MyThings
102
+-- Panels
103
+-- CMakeLists.txt
104
\endcode
105
106
A separate \e plugin target is associated with the QML module. It is used at
107
runtime to load the module dynamically when the application doesn't already
108
link to the backing target. The plugin target will also be a library and is
109
normally installed to the same directory as the module's
110
\l{Module Definition qmldir Files}{qmldir} file.
111
112
The plugin target should ideally contain nothing more than a trivial
113
implementation of the plugin class. This allows the plugin to be designated as
114
optional in the \c qmldir file. Other targets can then link directly to the
115
backing target and the plugin will not be needed at runtime, which can improve
116
load-time performance. By default, a C++ source file that defines a minimal
117
plugin class will be automatically generated and added to the plugin target.
118
For cases where the QML module needs a custom plugin class implementation, the
119
\l{NO_GENERATE_PLUGIN_SOURCE} and usually the \l{NO_PLUGIN_OPTIONAL} options
120
will be needed.
121
122
The \c STATIC QML modules also generate the static QML plugins if
123
\c NO_PLUGIN is not specified. Targets that import such \c STATIC QML modules
124
also need to explicitly link to corresponding QML plugins.
125
126
\note
127
When using static linking, it might be necessary to use
128
\l {Q_IMPORT_QML_PLUGIN} to ensure that the QML plugin is correctly linked.
129
130
\section3 Plugin target with no backing target
131
132
A QML module can be defined with the plugin target serving as its own backing
133
target. In this case, the module must be loaded dynamically at runtime and
134
cannot be linked to directly by other targets. To create this arrangement,
135
the \c PLUGIN_TARGET keyword must be used, with the \c target repeated as the
136
plugin target name. For example:
137
138
\badcode
139
qt_add_qml_module(someTarget
140
PLUGIN_TARGET someTarget
141
...
142
)
143
\endcode
144
145
While this arrangement may seem marginally simpler to deploy, a separate
146
backing target should be preferred where possible due to the potentially better
147
load-time performance.
148
149
\section3 Executable as a QML module
150
151
An executable target can act as a backing target for a QML module. In this case,
152
there will be no plugin library, since the QML module will always be loaded
153
directly as part of the application. The \c{qt_add_qml_module()} command will
154
detect when an executable is used as the backing target and will automatically
155
disable the creation of a separate plugin. Do not use any of the options with
156
\c{PLUGIN} in their name when using this arrangement.
157
158
When an executable is used as the backing target, the source directory structure
159
is not expected to match the QML module's target path.
160
See \l{qmlcachegen-auto}{Caching compiled QML sources} for additional target
161
path differences for compiled-in resources.
162
163
164
\target qmldir-autogeneration
165
\section2 Auto-generating \c{qmldir} and typeinfo files
166
167
By default, a \l{Module Definition qmldir Files}{qmldir} file and a typeinfo
168
file will be auto-generated for the QML module being defined. The contents of
169
those files are determined by the various arguments given to this command, as
170
well as the sources and \c{.qml} files added to the backing target.
171
The \l OUTPUT_DIRECTORY argument determines where the \c qmldir and typeinfo
172
files will be written to. If the QML module has a plugin, that plugin will also
173
be created in the same directory as the \c qmldir file.
174
175
If \l{QTP0004} policy is set to \c NEW, for each further directory that contains
176
\c{.qml} files another \c qmldir file is generated. These extra \c qmldir files
177
merely redirect to the module's base directory via a \c prefer directive. This
178
is so that all the QML components in a module can access each other, no matter
179
which directory they are stored in.
180
181
If using a statically built Qt, the backing target's \c{.qml} files will be
182
scanned during the CMake configure run to determine the imports used by the
183
module and to set up linking relationships (the \c{NO_IMPORT_SCAN} keyword
184
can be given to disable this). When a \c{.qml} file is added to or
185
removed from the module, CMake will normally re-run automatically and the
186
relevant files will be re-scanned, since a \c{CMakeLists.txt} file will have
187
been modified. During the course of development, an existing \c{.qml} file may
188
add or remove an import or a type. On its own, this would not cause CMake to
189
re-run automatically, so you should explicitly re-run CMake to force the
190
\c qmldir file to be regenerated and any linking relationships to be updated.
191
192
The backing target's C++ sources are scanned at build time to generate a
193
typeinfo file and a C++ file to register the associated types. The generated
194
C++ file is automatically added to the backing target as a source.
195
This requires \c AUTOMOC to be enabled on the target. The project is
196
responsible for ensuring this, usually by setting the \c CMAKE_AUTOMOC variable
197
to \c TRUE before calling \c qt_add_qml_module(), or by passing in an existing
198
target with the \c AUTOMOC target property already set to \c TRUE. It isn't an
199
error to have \c AUTOMOC disabled on the target, but the project is then
200
responsible for handling the consequences. This may include having to manually
201
generate the typeinfo file instead of allowing it to be auto-generated with
202
missing details, and adding C++ code to register the types.
203
204
Projects should prefer to use the auto-generated typeinfo and \c qmldir files
205
where possible. They are easier to maintain and they don't suffer from the same
206
susceptibility to errors that hand-written files do. Nevertheless, for
207
situations where the project needs to provide these files itself, the
208
auto-generation can be disabled. The \c NO_GENERATE_QMLDIR option disables the
209
\c qmldir auto-generation and the \c NO_GENERATE_QMLTYPES option disables the
210
typeinfo and C++ type registration auto-generation. If the auto-generated
211
typeinfo file is acceptable, but the project wants to use a different name for
212
that file, it can override the default name with the \c TYPEINFO option (but
213
this should not typically be needed).
214
215
\target qmlcachegen-auto
216
\section2 Caching compiled QML sources
217
218
All \c{.qml}, \c{.js}, and \c{.mjs} files added to the module via the
219
\c QML_FILES argument will be compiled to bytecode and cached directly in the
220
backing target. This improves load-time performance of the module. The original
221
uncompiled files are also stored in the backing target's resources, as these
222
may still be needed in certain situations by the QML engine.
223
224
The resource path of each file is determined by its path relative to the
225
current source directory (\c CMAKE_CURRENT_SOURCE_DIR). This resource path is
226
appended to a prefix formed by concatenating the \l{RESOURCE_PREFIX} and
227
the target path (but see \l NO_RESOURCE_TARGET_PATH for an exception to this).
228
229
If \l{QTP0001} policy is set to \c NEW, the \l{RESOURCE_PREFIX} defaults
230
to \c{/qt/qml/} which is the default import path of the QML engine.
231
This ensures that modules are put into the \l{QML Import Path} and can be
232
found without further setup.
233
234
Ordinarily, the project should aim to place \c{.qml} files in
235
the same relative location as they would have in the resources. If the \c{.qml}
236
file is in a different relative directory to its desired resource path, its
237
location in the resources needs to be explicitly specified. This is done by
238
setting the \c QT_RESOURCE_ALIAS source file property, which must be set before
239
the \c{.qml} file is added. For example:
240
241
\badcode
242
set_source_files_properties(path/to/somewhere/MyFrame.qml PROPERTIES
243
QT_RESOURCE_ALIAS MyFrame.qml
244
)
245
246
qt_add_qml_module(someTarget
247
URI MyCo.Frames
248
RESOURCE_PREFIX /my.company.com/imports
249
QML_FILES
250
path/to/somewhere/MyFrame.qml
251
AnotherFrame.qml
252
)
253
\endcode
254
255
In the above example, the target path will be \c{MyCo/Frames}. After
256
taking into account the source file properties, the two \c{.qml} files will be
257
found at the following resource paths:
258
259
\list
260
\li \c{/my.company.com/imports/MyCo/Frames/MyFrame.qml}
261
\li \c{/my.company.com/imports/MyCo/Frames/AnotherFrame.qml}
262
\endlist
263
264
In the rare case that you want to override the automatic selection of the
265
qmlcachegen program to be used, you may set the \c QT_QMLCACHEGEN_EXECUTABLE
266
target property on the module target. For example:
267
268
\badcode
269
set_target_properties(someTarget PROPERTIES
270
QT_QMLCACHEGEN_EXECUTABLE qmlcachegen
271
)
272
\endcode
273
274
This explicitly selects qmlcachegen as the program to be used, even if
275
better alternatives are available.
276
277
Furthermore, you can pass extra arguments to qmlcachegen, by setting the
278
\c QT_QMLCACHEGEN_ARGUMENTS option. In particular, the \c --only-bytecode
279
option will turn off compilation of QML script code to C++. For example:
280
281
\badcode
282
set_target_properties(someTarget PROPERTIES
283
QT_QMLCACHEGEN_ARGUMENTS "--only-bytecode"
284
)
285
\endcode
286
287
Another important argument is \c{--direct-calls}. You can use it to enable the
288
direct mode of \l{The QML script compiler} in case the Qt Quick Compiler
289
Extensions are installed. If the extensions are not installed, the argument is
290
ignored. There is a shorthand called \c {QT_QMLCACHEGEN_DIRECT_CALLS} for it.
291
292
\badcode
293
set_target_properties(someTarget PROPERTIES
294
QT_QMLCACHEGEN_DIRECT_CALLS ON
295
)
296
\endcode
297
298
Finally, the \c --verbose argument can be used to see diagnostic output from
299
qmlcachegen:
300
301
\badcode
302
set_target_properties(someTarget PROPERTIES
303
QT_QMLCACHEGEN_ARGUMENTS "--verbose"
304
)
305
\endcode
306
307
With this flag set, qmlcachegen will output warnings for each function it
308
cannot compile to C++. Some of these warnings will point to problems in your
309
QML code and some will tell you that certain features of the QML language are
310
not implemented in the C++ code generator. In both cases, qmlcachegen will
311
still generate byte code for such functions. If you want to see only the
312
problems in your QML code, you should use qmllint and the targets generated
313
for it instead.
314
315
\target qmllint-auto
316
\section2 Linting QML sources
317
318
A separate linting target will be automatically created if any \c{.qml} files
319
are added to the module via the \c QML_FILES keyword, or by a later call to
320
\l{qt6_target_qml_sources}{qt_target_qml_sources()}. The name of the linting
321
target will be the \c target followed by \c{_qmllint}. An \c{all_qmllint}
322
target which depends on all the individual \c{*_qmllint} targets is also
323
provided as a convenience.
324
325
A \c dump_qml_context_properties global build target is automatically created
326
that runs \l qmlcontextpropertydump when no qml context property dump file
327
already exists. \l qmlcontextpropertydump creates a qml context property dump file
328
that is read by \l qmllint to warn about usages of context properties in QML.
329
330
A \c clean_qml_context_properties global build target allows to delete an already
331
existing qml context property dump file, and can be used to recompute the qml context
332
property dump file on a future build of the \c dump_qml_context_properties global build
333
target.
334
335
Linting targets depend on the \c dump_qml_context_properties build target when
336
the \l QT_QMLLINT_CONTEXT_PROPERTY_DUMP variable is enabled.
337
338
339
\target qml-naming-js-files
340
\section2 Naming conventions for \c{.js} files
341
342
JavaScript file names that are intended to be addressed as components should
343
start with an uppercase letter.
344
345
Alternatively, you may use lowercase file names and set the source file
346
property \l QT_QML_SOURCE_TYPENAME to the desired type name.
347
348
\target qml-cmake-singletons
349
\section2 Singletons
350
351
If a QML module has \c{.qml} files which provide singleton types, these files
352
need to have their \c QT_QML_SINGLETON_TYPE source property set to \c TRUE, to
353
ensure that the \c singleton command is written into the
354
\l{Module Definition qmldir Files}{qmldir} file. This must be done in addition
355
to the QML file containing the \c {pragma Singleton} statement.
356
The source property must be set before creating the module the
357
singleton belongs to.
358
359
See \l{qt_target_qml_sources_example}{qt_target_qml_sources()} for an example on
360
how to set the \c QT_QML_SINGLETON_TYPE property.
361
362
\target qmltc-cmake
363
\section2 Compiling QML to C++ with QML type compiler
364
365
\note The \l{QML type compiler} \c{qmltc} does not guarantee that the generated
366
C++ stays API-, source- or binary-compatible between past or future versions,
367
even patch versions.
368
Furthermore, qmltc-compiled apps using Qt's QML modules will require linking
369
against private Qt API, see also
370
\l{QML type compiler#compiling-qml-code-with-qmltc}{Compiling QML code with qmltc}.
371
372
373
If a QML module has \c{.qml} files, you can compile them to C++ using \l{QML
374
type compiler}{qmltc}. Unlike \l{qmlcachegen-auto}{bytecode compilation}, you
375
have to explicitly enable qmltc via \l{ENABLE_TYPE_COMPILER} argument. In which
376
case, \c{.qml} files specified under \c{QML_FILES} would be compiled. Files
377
ending with \c{.js} and \c{.mjs} are ignored as qmltc does not compile
378
JavaScript code. Additionally, files marked with QT_QML_SKIP_TYPE_COMPILER
379
source file property are also skipped.
380
381
By default, qmltc creates lower-case \c{.h} and \c{.cpp} files for a given
382
\c{.qml} file. For example, \c{Foo.qml} ends up being compiled into \c{foo.h}
383
and \c{foo.cpp}.
384
385
The created C++ files are placed into a dedicated \c{.qmltc/<target>/}
386
sub-directory of the \c BINARY_DIR of the \c target. These files are then
387
automatically added to the target sources and compiled as Qt C++ code along with
388
other source files.
389
390
While processing QML_FILES, the following source file properties are respected:
391
\list
392
\li \c{QT_QMLTC_FILE_BASENAME}: use this source file property to specify a
393
non-default .h and .cpp file name, which might be useful to e.g. resolve
394
conflicting file names (imagine you have main.qml that is being
395
compiled, but main.h already exists, so #include "main.h" might not do
396
what you expect it to do). QT_QMLTC_FILE_BASENAME is expected to be a
397
file name (without extension), so any preceding directory is ignored.
398
Unlike in the case of default behavior, the QT_QMLTC_FILE_BASENAME is
399
not lower-cased.
400
\li \c{QT_QML_SKIP_TYPE_COMPILER}: use this source file property to
401
specify that a QML file must be ignored by qmltc.
402
\endlist
403
404
\section1 Arguments
405
406
\section2 Required arguments
407
408
The \c target specifies the name of the backing target for the QML module.
409
By default, it is created as a shared library if Qt was built as shared
410
libraries, or as a static library otherwise. This choice can be explicitly
411
overridden with the \c STATIC or \c SHARED options.
412
413
Every QML module must define a \c URI. It should be specified in dotted URI
414
notation, such as \c{QtQuick.Layouts}. Each segment must be a well-formed
415
ECMAScript Identifier Name. This means, for example, the segments
416
must not start with a number and they must not contain \e{-} (minus)
417
characters. As the \c URI will be translated into directory names, you
418
should restrict it to alphanumeric characters of the latin alphabet,
419
underscores, and dots. Other QML modules may use this name in
420
\l{qtqml-syntax-imports.html}{import statements} to import the module. The
421
\c URI will be used in the \c module line of the generated
422
\l{Module Definition qmldir Files}{qmldir} file. The \c URI is also used to
423
form the \e{target path} by replacing dots with forward slashes.
424
425
See \l{qtqml-modules-identifiedmodules.html}{Identified Modules} for further
426
in-depth discussion of the module URI.
427
428
\section2 Versions
429
430
A QML module can also define a \c VERSION in the form \c{Major.Minor}, where
431
both \c Major and \c Minor must be integers. An additional \c{.Patch}
432
component may be appended, but will be ignored. A list of earlier major
433
versions the module provides types for can also optionally be given after the
434
\c PAST_MAJOR_VERSIONS keyword (see below).
435
See \l{qtqml-modules-identifiedmodules.html}{Identified Modules} for further
436
in-depth discussion of version numbering,
437
\l{Registering past major versions} for registering past major versions, and
438
\l{Keeping module versions in sync} for keeping module versions in sync.
439
440
If you don't need versions you should omit the \c VERSION argument. It defaults
441
to the highest possible version. Internal versioning of QML modules has some
442
fundamental flaws. You should use an external package management mechanism to
443
manage different versions of your QML modules.
444
445
\section2 Adding sources and resources to the module
446
447
\note A QML module is a logically grouped, self-contained unit of functionality.
448
All files that make up the module should reside in the same directory as the CMakeLists.txt
449
defining the module or in one of its subdirectories.
450
If a specific functionality is required in multiple modules, consider encapsulating it within
451
a separate module. This module can then be imported into other modules, promoting code reuse
452
and maintainability.
453
454
\c SOURCES specifies a list of non-QML sources to be added to the backing
455
target. It is provided as a convenience and is equivalent to adding the sources
456
to the backing target with the built-in \c{target_sources()} CMake command.
457
458
\c QML_FILES lists the \c{.qml}, \c{.js} and \c{.mjs} files for the module.
459
These will be automatically \l{qmlcachegen-auto}{compiled into bytecode} and
460
embedded in the backing target unless the \c NO_CACHEGEN option is given.
461
The uncompiled file is always stored in the embedded resources of the backing
462
target, even if \c NO_CACHEGEN is specified. Unless the \c NO_LINT option is
463
given, the uncompiled files will also be
464
\l{Linting QML sources}{processed by \c qmllint} via a separate custom build
465
target. The files will also be used to populate type information in the
466
generated \l{Module Definition qmldir Files}{qmldir} file by default.
467
\c NO_GENERATE_QMLDIR can be given to disable the automatic generation of the
468
\c qmldir file. This should normally be avoided, but for cases where the
469
project needs to provide its own \c qmldir file, this option can be used.
470
Since Qt 6.8, when \l{QTP0004} is enabled, \c qt_add_qml_module will
471
create additional \c qmldir files for each subdirectory in the QML module,
472
which ensure that each QML file will import its own module via the implicit
473
import. This behavior can be turned off for a QML module by passing the
474
\c NO_GENERATE_EXTRA_QMLDIRS flag to it.
475
The \c NO_GENERATE_QMLDIR implies \c NO_GENERATE_EXTRA_QMLDIRS.
476
477
\note See \l{qt6_target_qml_sources}{qt_target_qml_sources()} for further details on
478
how to add qmlfiles after \c qt_add_qml_module() was called.
479
For example, you may wish to add files conditionally based on an if statement
480
expression, or from subdirectories that will only be added if certain criteria
481
are met.
482
Furthermore, files added with \l{qt6_target_qml_sources}{qt_target_qml_sources()}
483
also can specify if they should be skipped for the linting,
484
\l{qmlcachegen-auto}{bytecode compilation} or \c qmldir file generation.
485
486
\c RESOURCES lists any other files needed by the module, such as images
487
referenced from the QML code. These files will be added as compiled-in
488
resources (see \l RESOURCE_PREFIX for an explanation of the base point they
489
will be located under). If needed, their relative location can
490
be controlled by setting the \c QT_RESOURCE_ALIAS source property, just as for
491
\c{.qml} files (see \l{qmlcachegen-auto}{Caching compiled QML sources}).
492
493
\target RESOURCE_PREFIX
494
\c RESOURCE_PREFIX is intended to encapsulate a namespace for the project and
495
will often be the same for all QML modules that the project defines.
496
497
However, it is better to set the \l QTP0001 CMake policy instead. It defines a
498
default resource prefix that ensures that your QML module ends
499
up under one of the QML engine's default \l[QtQml]{QML Import Path}{import paths}.
500
501
If you set a \c RESOURCE_PREFIX, you should also add it to the
502
\l[QtQml]{QML Import Path}{import paths} for the QML Engine to find the QML module.
503
504
If \l QTP0001 is enabled (e.g. via
505
\c {qt_standard_project_setup(REQUIRES 6.5)}), the default value is
506
\c "/qt/qml/", otherwise it is \c {"/"}.
507
508
\target NO_RESOURCE_TARGET_PATH
509
When various files are added to the compiled-in resources, they are placed
510
under a path formed by concatenating the \c RESOURCE_PREFIX and the target path.
511
For the special case where the backing target is an executable, it may be
512
desirable to place the module's \c{.qml} files and other resources directly
513
under the \c RESOURCE_PREFIX instead. This can be achieved by specifying the
514
\c NO_RESOURCE_TARGET_PATH option, which may only be used if the backing target
515
is an executable.
516
517
\target PAST_MAJOR_VERSIONS
518
\section2 Registering past major versions
519
520
\c PAST_MAJOR_VERSIONS contains a list of additional major version that the module
521
provides. For each of those versions and each QML file
522
without a \c QT_QML_SOURCE_VERSIONS setting an additional entry in the
523
\l{Module Definition qmldir Files}{qmldir} file will be generated to specify
524
the extra version. Furthermore, the generated module registration code will
525
register the past major versions using \l{qmlRegisterModule()} on the C++ side.
526
The module registration code is automatically generated for your QML module,
527
unless you specify \c{NO_GENERATE_QMLTYPES} (but use of this option is strongly
528
discouraged). Usage of \c PAST_MAJOR_VERSIONS adds some overhead when your
529
module is imported. You should increment the major version of your module as
530
rarely as possible. Once you can rely on all QML files importing this module to
531
omit the version in their imports, you can safely omit \c{PAST_MAJOR_VERSIONS}.
532
All the QML files will then import the latest version of your module. If you
533
have to support versioned imports, consider supporting only a limited number of
534
past major versions.
535
536
\section2 Declaring module dependencies
537
538
\target IMPORTS
539
\c IMPORTS provides a list of other QML modules that this module imports. Each
540
module listed here will be added as an \c{import} entry in the generated
541
\l{Module Definition qmldir Files}{qmldir} file. If a QML file imports
542
this module, it also imports all the modules listed under \c{IMPORTS}.
543
Optionally, a version can be specified by appending it after a slash, such as
544
\c{QtQuick/2.0}. Omitting the version will cause the greatest version available
545
to be imported. You may only specify the major version, as in \c{QtQuick/2}. In
546
that case the greatest minor version available with the given major version will
547
be imported. Finally, \c{auto} may be given as version (\c{QtQuick/auto}). If
548
\c{auto} is given, the version that the current module is being imported with is
549
propagated to the module to be imported. Given an entry \c{QtQuick/auto} in a
550
module \c{YourModule}, if a QML file specifies \c{import YourModule 3.14}, this
551
results in importing version \c{3.14} of \c{QtQuick}. For related modules that
552
follow a common versioning scheme, you should use \c{auto}.
553
554
Entries in \c IMPORTS may also refer to CMake targets by prefixing the target
555
name with the \c TARGET keyword. In this case, the QML module URI is determined
556
automatically from the target. This requires opting into the CMake policy
557
\l{QTP0005}.
558
559
For example, a QML module can import another module by referring to the
560
CMake target that provides it:
561
562
\badcode
563
qt_add_qml_module(my_module
564
URI MyModule
565
VERSION 1.0
566
IMPORTS
567
TARGET OtherQmlModule
568
)
569
\endcode
570
571
\c OPTIONAL_IMPORTS provides a list of other QML modules that this module
572
\e may import at run-time. These are not automatically imported by the QML
573
engine when importing the current module, but rather serve as hints to tools
574
like \c qmllint. Versions can be specified in the same way as for \c IMPORTS.
575
Each module listed here will be added as an \c{optional import} entry in the
576
generated \l{Module Definition qmldir Files}{qmldir} file.
577
578
\c DEFAULT_IMPORTS specifies which of the optional imports are the default entries
579
that should be loaded by tooling. One entry should be specified for every group of
580
\c OPTIONAL_IMPORTS in the module. As optional imports are only resolved at runtime,
581
tooling like qmllint cannot in general know which of the optional imports should
582
be resolved. To remedy this, you can specify one of the optional imports as the
583
default import; tooling will then pick it. If you have one optional import that
584
gets used at runtime without any further configuration, that is an ideal candidate
585
for the default import.
586
587
\c DEPENDENCIES provides a list of other QML modules that this module depends
588
on, but doesn't necessarily import. It would typically be used for dependencies
589
that only exist at the C++ level, such as a module registering a class to QML
590
which uses or inherits C++ defined types defined in another module.
591
592
For example, if one would like to subclass \c QQuickItem as following:
593
594
\badcode
595
class MyItem: public QQuickItem { ... };
596
\endcode
597
598
then one has to make sure that the module containing \c QQuickItem, called
599
\c QtQuick, is declared as a dependency via the \c DEPENDENCIES option:
600
601
\badcode
602
qt_add_qml_module(myTarget
603
...
604
DEPENDENCIES QtQuick
605
)
606
\endcode
607
608
Not doing so might result in linting errors, errors during type compilation
609
with \l{QML type compiler}{qmltc} or during binding and function compilation to C++
610
with \l{qmlcachegen-auto}{qmlcachegen}.
611
612
Another example might be:
613
\code
614
class MyComponent : public QObject {
615
Q_OBJECT
616
QML_ELEMENT
617
618
// ...
619
620
signals:
621
void sigZoomAtMousePosition(const QPointF& aMousePos, double aZoomScaleFactor);
622
};
623
\endcode
624
where \c{DEPENDENCIES QtQml} is required for QML tooling to find and use QPointF:
625
\badcode
626
qt_add_qml_module(myTarget
627
...
628
DEPENDENCIES QtQml
629
)
630
\endcode
631
632
Entries in \c DEPENDENCIES may also refer to CMake targets by prefixing the
633
target name with the \c TARGET keyword. In this case, the QML module URI and
634
import path are determined automatically from the target. This requires
635
opting into the CMake policy \l{QTP0005}.
636
637
For example, a QML module can declare a dependency on another module by
638
referring to the CMake target that provides it:
639
640
\badcode
641
qt_add_qml_module(my_module
642
URI MyModule
643
VERSION 1.0
644
DEPENDENCIES
645
TARGET OtherQmlModule
646
)
647
\endcode
648
649
\note Using TARGET <cmake-target> in DEPENDENCIES or IMPORTS does not automatically
650
link against the given target. It is used only to derive QML metadata, import paths,
651
and to establish build-order dependencies. If the QML module or its generated plugin
652
requires symbols from that target, the target must still be linked explicitly using
653
target_link_libraries().
654
655
\note The <cmake-target> used with the \c TARGET keyword must be a target built
656
by your project (not an imported target provided by find_package).
657
658
\note Adding the module to \c DEPENDENCIES is not necessary if the module
659
is already imported via the \c IMPORTS option. The recommended way is to
660
use the lighter alternative \c DEPENDENCIES over \c IMPORTS.
661
662
The module version of the
663
dependencies must be specified along with the module name, in the same form as
664
used for \c IMPORTS and \c OPTIONAL_IMPORTS. Each module listed here will be
665
added as a \c{depends} entry in the generated
666
\l{Module Definition qmldir Files}{qmldir} file.
667
668
\target IMPORT_PATH
669
\c IMPORT_PATH can be used to add to the search paths where other QML modules
670
that this one depends on can be found. The other modules must have their
671
\c qmldir file under their own target path below one of the search paths.
672
673
If the backing target is a static library and that static library will be
674
installed, \c OUTPUT_TARGETS should be given to provide a variable in which to
675
store a list of additional targets that will also need to be installed.
676
These additional targets are generated internally by \c{qt_add_qml_module()}
677
and are referenced by the backing target's linking requirements as part of
678
ensuring that resources are set up and loaded correctly.
679
680
\target PLUGIN_TARGET
681
\section2 Targets and plugin targets
682
683
\c PLUGIN_TARGET specifies the plugin target associated with the QML module.
684
The \c PLUGIN_TARGET can be the same as the backing
685
\c target, in which case there will be no separate backing target.
686
If \c PLUGIN_TARGET is not given, it defaults to \c target with \c plugin
687
appended. For example, a backing target called \c mymodule would have a default
688
plugin name of \c mymoduleplugin. The plugin target's name will be used to
689
populate a \c{plugin} line in the generated
690
\l{Module Definition qmldir Files}{qmldir} file. Therefore, you must not try to
691
change the plugin's output name by setting target properties like
692
\c OUTPUT_NAME or any of its related properties.
693
694
The backing \c target and the plugin target (if different) will be created by
695
the command, unless they already exist. Projects should generally let them be
696
created by the command so that they are created as the appropriate target type.
697
If the backing \c target is a static library, the plugin will also be created
698
as a static library. If the backing \c target is a shared library, the plugin
699
will be created as a module library. If an existing \c target is passed in and
700
it is an executable target, there will be no plugin. If you intend to always
701
link directly to the backing target and do not need a plugin, it can be
702
disabled by adding the \c NO_PLUGIN option. Specifying both \c NO_PLUGIN and
703
\c PLUGIN_TARGET is an error.
704
705
\target NO_CREATE_PLUGIN_TARGET
706
In certain situations, the project may want to delay creating the plugin target
707
until after the call. The \c NO_CREATE_PLUGIN_TARGET option can be given in
708
that situation. The project is then expected to call
709
\l{qt6_add_qml_plugin}{qt_add_qml_plugin()} on the plugin target once it has
710
been created. When \c NO_CREATE_PLUGIN_TARGET is given, \c PLUGIN_TARGET must
711
also be provided to explicitly name the plugin target.
712
713
\target CLASS_NAME
714
\target NO_GENERATE_PLUGIN_SOURCE
715
By default, \c{qt_add_qml_module()} will auto-generate a \c{.cpp} file that
716
implements the plugin class named by the \c CLASS_NAME argument. The generated
717
\c{.cpp} file will be automatically added to the plugin target as a source file
718
to be compiled. If the project wants to provide its own implementation of the
719
plugin class, the \c NO_GENERATE_PLUGIN_SOURCE option should be given. Where no
720
\c CLASS_NAME is provided, it defaults to the \c URI with dots replaced by
721
underscores, then \c Plugin appended. Unless the QML module has no plugin, the
722
class name will be recorded as a \c classname line in the generated
723
\l{Module Definition qmldir Files}{qmldir} file. You need to add any C++ files
724
with custom plugin code to the plugin target. Since the plugin then likely
725
contains functionality that goes beyond simply loading the backing library, you
726
will probably want to add \l{NO_PLUGIN_OPTIONAL}, too. Otherwise the QML engine
727
may skip loading the plugin if it detects that the backing library is already
728
linked.
729
730
\target NO_PLUGIN
731
If the \c NO_PLUGIN keyword is given, then no plugin will be built. This
732
keyword is thus incompatible with all the options that customize the plugin
733
target, in particular \l{NO_GENERATE_PLUGIN_SOURCE}, \l{NO_PLUGIN_OPTIONAL},
734
\l{PLUGIN_TARGET}, \l{NO_CREATE_PLUGIN_TARGET}, and \l{CLASS_NAME}. If you do
735
not provide a plugin for your module, it will only be fully usable if its
736
backing library has been linked into the executable. It is generally hard to
737
guarantee that a linker preserves the linkage to a library it considers unused.
738
739
\target NO_PLUGIN_OPTIONAL
740
If the \c NO_PLUGIN_OPTIONAL keyword is given, then the plugin is recorded in
741
the generated \c qmldir file as non-optional. If all of a QML module's
742
functionality is implemented in its backing target and the plugin target is
743
separate, then the plugin can be optional, which is the default and recommended
744
arrangement. The auto-generated plugin source file satisfies this requirement.
745
Where a project provides its own \c{.cpp} implementation for the plugin, that
746
would normally mean the \c NO_PLUGIN_OPTIONAL keyword is also needed because
747
the plugin will almost certainly contain functionality that the QML module
748
requires.
749
750
\section2 Automatic type registration
751
752
Type registration is automatically performed for the backing target's C++
753
sources that are processed by AUTOMOC. This will generate a typeinfo file in the
754
\l{OUTPUT_DIRECTORY}{output directory}, the file name being the \c target name
755
with \c{.qmltypes} appended. This file name can be changed using the
756
\c TYPEINFO option if desired, but this should not normally be necessary.
757
The file name is also recorded as a \c typeinfo entry in the generated
758
\l{Module Definition qmldir Files}{qmldir} file. Automatic type registration
759
can be disabled using the \c NO_GENERATE_QMLTYPES option, in which case no
760
typeinfo file will be generated, but the project will still be expected to
761
generate a typeinfo file and place it in the same directory as the generated
762
\c qmldir file.
763
764
\target OUTPUT_DIRECTORY
765
\c OUTPUT_DIRECTORY specifies where the plugin library, \c qmldir and typeinfo
766
files are generated. When this keyword is not given, the default value will be
767
the target path (formed from the \c URI) appended to the value of the
768
\l QT_QML_OUTPUT_DIRECTORY variable.
769
If that variable is not defined, the default depends on the type of backing
770
target. For executables, the value will be the target path appended to
771
\c{${CMAKE_CURRENT_BINARY_DIR}}, whereas for other targets it will be just
772
\c{${CMAKE_CURRENT_BINARY_DIR}}. When the structure of the source tree
773
matches the structure of QML module target paths (which is highly recommended),
774
\l QT_QML_OUTPUT_DIRECTORY often isn't needed. In order to match the structure
775
of the target paths, you have to call your directories \e exactly like the
776
segments of your module URI. For example, if your module URI is
777
\c{MyUpperCaseThing.mylowercasething}, you need to put this in a directory
778
called \c{MyUpperCaseThing/mylowercasething/}.
779
780
The need for specifying the \c OUTPUT_DIRECTORY keyword should be rare, but if
781
it is used, it is likely that the caller will also need to add to the
782
\l IMPORT_PATH to ensure that \l{qmllint-auto}{linting},
783
\l{qmlcachegen-auto}{cached compilation} of qml sources,
784
\l{qt6_import_qml_plugins}{automatic importing} of plugins in static builds,
785
and \l{qt_deploy_qml_imports}{deploying imported QML modules} for non-static
786
builds all work correctly.
787
788
\section2 Qt Quick Designer compatibility
789
790
\c DESIGNER_SUPPORTED should be given if the QML module supports
791
Qt Quick Designer. When present, the generated \c qmldir file will contain
792
a \c designersupported line. See \l{Module Definition qmldir Files} for how
793
this affects the way Qt Quick Designer handles the plugin.
794
795
\section2 Keeping module versions in sync
796
797
The \c FOLLOW_FOREIGN_VERSIONING keyword relates to base types of your own
798
C++-defined QML types that live in different QML modules. Typically, the
799
versioning scheme of your module does not match that of the module providing
800
the base types. Therefore, by default all revisions of the base types are
801
made available in any import of your module. If \c FOLLOW_FOREIGN_VERSIONING
802
is given, the version information attached to the base types and their
803
properties is respected. So, an \c {import MyModule 2.8} will then only make
804
available versioned properties up to version \c{2.8} of any base types outside
805
\c{MyModule}.
806
This is mostly useful if you want to keep your module version in sync
807
with other modules you're basing types on. In that case you might want your custom
808
types to not expose properties from a module's base type version greater than the one being
809
imported.
810
811
\section2 C++ namespaces of generated code
812
813
If a namespace is given with the \c NAMESPACE keyword, the plugin and registration
814
code will be generated into a C++ namespace of this name.
815
816
\section2 qmlimportscanner and NO_IMPORT_SCAN
817
818
For static Qt builds, \c{qmlimportscanner} is run at configure time to scan the
819
\c{.qml} files of a QML module and identify the QML imports it uses (see
820
\l{qt6_import_qml_plugins}{qt_import_qml_plugins()}). For non-static Qt builds,
821
if the target is an executable, a similar scan is performed at build time to
822
provide the information needed by deployment scripts (see
823
\l{qt6_deploy_qml_imports}{qt_deploy_qml_imports()}). Both scans can be
824
disabled by providing the \c{NO_IMPORT_SCAN} option. Doing so means the project
825
takes on the responsibility of ensuring all required plugins are instantiated
826
and linked for static builds. For non-static builds the project must manually
827
work out and deploy all QML modules used by an executable target.
828
829
\section2 DISCARD_QML_CONTENTS
830
831
\target DISCARD_QML_CONTENTS
832
By default, QML and JS source file contents are included in the target's resource system.
833
Use \c DISCARD_QML_CONTENTS to remove these contents and reduce the binary size.
834
835
\note If you omit the source code from the binary, the QML engine has to
836
rely on the compilation units created by \l{qmlcachegen} or \l{qmlsc}.
837
Those are tied to the specific version of Qt they were built with. If you change
838
the version of Qt your application uses, they can't be loaded anymore.
839
840
\section2 Arguments for qmltc
841
842
\target ENABLE_TYPE_COMPILER
843
\c ENABLE_TYPE_COMPILER can be used to compile \c{.qml} files to C++ source code
844
with \l{QML type compiler}{qmltc}. Files with the source property
845
\c{QT_QML_SKIP_TYPE_COMPILER} are not compiled to C++.
846
847
\c TYPE_COMPILER_NAMESPACE argument allows to override the namespace in which
848
\l{QML type compiler}{qmltc} generates code.
849
By default, the namespace of the generated code follows the module
850
hierarchy as depicted in the URI,
851
e.g., \c MyModule for a module with URI \c MyModule or
852
\c com::example::Module for URI \c com.example.MyModule.
853
By specifying the \c TYPE_COMPILER_NAMESPACE option, the generated code
854
can be put instead in a custom namespace, where different subnamespaces are to
855
be separated by a "::", e.g. "MyNamespace::MySubnamespace" for the namespace MySubnamespace that
856
is inside the MyNamespace. Apart from the "::", C++ namespace naming rules
857
apply.
858
859
\c QMLTC_QMLTC_EXPORT_DIRECTIVE should be used with \c QMLTC_EXPORT_FILE_NAME when
860
the classes generated by \l{QML type compiler}{qmltc} should be exported from
861
the qml library. By default, classes generated by qmltc are not exported from
862
their library.
863
The header defining the export macro for the current library
864
can be specified as an optional argument to \c QMLTC_EXPORT_FILE_NAME while the
865
exporting macro name should be specified as an argument to
866
\c QMLTC_QMLTC_EXPORT_DIRECTIVE. If no additional include is required or wanted,
867
e.g. when the header of the export macro is already indirectly included by a base
868
class, then the \c QMLTC_EXPORT_FILE_NAME option can be left out.
869
*/
qtdeclarative
src
qml
doc
src
cmake
qt_add_qml_module.qdoc
Generated on
for Qt by
1.16.1