# Qt6 module

*New in Meson 0.57.0*

The Qt6 module provides methods to automatically deal with the various
tools and steps required for Qt.

<div class="alert alert-warning">
<strong>Warning:</strong> before version 0.63.0 Meson would fail to find
Qt 6.1 or later due to the Qt tools having moved to the libexec subdirectory,
and tool names being suffixed with only the Qt major version number e.g. qmake6.
</div>

## Dependencies

Qt is a framework with many sub-modules, meson can selectively look for and link with any combination,
see [Qt dependencies](Dependencies.md#qt).

## Examples

We provide examples to showcase how meson can be used to build Qt applications.

### Simple example

```meson
qt6 = import('qt6')
qt6_dep = dependency('qt6', modules: ['Core', 'Gui'])
inc = include_directories('includes')
moc_files = qt6.compile_moc(headers : 'myclass.h',
                            extra_arguments: ['-DMAKES_MY_MOC_HEADER_COMPILE'],
                            include_directories: inc,
                            dependencies: qt6_dep)
translations = qt6.compile_translations(ts_files : 'myTranslation_fr.ts', build_by_default : true)
executable('myprog', 'main.cpp', 'myclass.cpp', moc_files,
           include_directories: inc,
           dependencies : qt6_dep)
```

Sometimes, translations are embedded inside the binary using qresource
files. In this case the ts files do not need to be explicitly listed,
but will be inferred from the built qm files listed in the qresource
file. For example:

```meson
qt6 = import('qt6')
qt6_dep = dependency('qt6', modules: ['Core', 'Gui'])
lang_cpp = qt6.compile_translations(qresource: 'lang.qrc')
executable('myprog', 'main.cpp', lang_cpp,
           dependencies: qt6_dep)
```

### QML-C++ integration

A complex Qt app that uses

- A Qt resource collection file
  ([documentation here](https://doc.qt.io/qt-6/resources.html))
- `QObject` (C++ only) derived C++ classes
- `QML_ELEMENT` and `Q_GADGET` annotated classes that are exposed to QML
  ([documentation here](https://doc.qt.io/qt-6/qtqml-cppintegration-definetypes.html))

can also be build with meson using the following methods of the qt module object:

- [compile_resources](#compile_resources)
- [compile_moc](#compile_moc)
- [qml_module](#qml_module)

**Note:** when using [qml_module](#qml_module) with C++ `QML_ELEMENT` or `Q_GADGET` annotated headers in sub-folders,
their direct parent folder needs to be added to "include directories". This will cause problems is the header names are not unique.

Here's an example meson code

```meson

# these sources do not contain any QObject derived classes
source_files = [
  'main.cpp',
  'non-qt-sources/foo.cpp',
  'non-qt-sources/foo.h',
]

# these sources contain QObject derived classes but are not exposed to QML
moc_header_files = [
  'qt-cpp-only-sources/bar.cpp',
  'qt-cpp-only-sources/bar.h',
]

# classes that are Q_GADGET or QML_ELEMENT + QObject "tainted"
# that are exposed to QML and can be used in QML code
qmlcpp_files = [
  'qt-cpp-qml-integration/quux.cpp',
  'qt-cpp-qml-integration/quux.h',
]

# actual QML files that will be able to use
# C++ classes defined in 'qmlcpp_files'
qml_files = [
  'QML/Baz.qml',
]

fs = import('fs')

# workaround a Qt bug / design limitation:
#   we add the parent folder of every C++ header involved with QML to the include dirs
# see https://bugreports.qt.io/browse/QTBUG-93443
# see https://bugreports.qt.io/browse/QTBUG-87221
# Note: qmlcpp_file needs to be a list of str and not files() otherwise the logic bellow gets tripped
qmlcpp_inc_dirs = []
foreach qmlcpp_file: qmlcpp_files
  qmlcpp_inc_dirs += [include_directories(fs.parent(qmlcpp_file))]
endforeach

inc = include_directories('.')

qt6 = import('qt6')

# Qml and QmlIntegration are needed here
qt6_dep = dependency(
  'qt6',
  modules: ['Core', 'Gui', 'Network', 'Svg', 'Quick', 'Qml', 'QuickWidgets', 'QmlIntegration'],
  # To make the `win_subsystem: 'windows'` line below work on windows, the
  # program must provide a WinMain() or wWinMain() entrypoint. Qt provides a
  # library which provides these functions (which just call main()). To link
  # against the Qt6EntryPoint library, `main: true` must be supplied.
  main: true,
)

compiled_resources = qt6.compile_resources(sources: files('resources.qrc'))

# compile 'moc_header_files' list with moc
moc_files = qt6.compile_moc(
  headers: moc_header_files,
  include_directories: inc,
  dependencies: qt6_dep,
)

# everything involved in C++-QML interaction goes in here
# the can be split into many modules, but works with a single one too
qml_mods = qt6.qml_module(
  'MyModule',
  qml_sources: qml_files,
  moc_headers: qmlcpp_files,
  include_directories: qmlcpp_inc_dirs,
  dependencies: [qt6_dep],
)

# Build the final executable and give it all the resources built above
executable('MyExecutable',
  sources: [source_files, compiled_ressources, moc_files, qml_mods],
  include_directories: [inc] + qmlcpp_inc_dirs,
  dependencies: [qt6_dep],
  win_subsystem: 'windows', # useful for Windows: displays the app without spawning
                            # a console alongside it, no-op on other platforms.
                            # see also comment above on `main: true` dependency()
  install: true,
)
```

## Functions

### compile_resources

*New in 0.59.0*

Compiles Qt's resources collection files (.qrc) into c++ files for compilation.

It takes no positional arguments, and the following keyword arguments:
  - `name` (string | empty): if provided a single .cpp file will be generated,
    and the output of all qrc files will be combined in this file, otherwise
    each qrc file be written to its own cpp file.
  - `sources` (File | string | custom_target | custom_target index | generator_output)[]:
    A list of sources to be transpiled. Required, must have at least one source<br/>
    *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output.
  - `extra_args` string[]: Extra arguments to pass directly to `qt-rcc`
  - `method` string: The method to use to detect Qt, see [[dependency]]

### compile_ui

*New in 0.59.0*

Compiles Qt's ui files (.ui) into header files.

It takes no positional arguments, and the following keyword arguments:
  - `sources` (File | string | custom_target | custom_target index | generator_output)[]:
    A list of sources to be transpiled. Required, must have at least one source<br/>
    *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output.
  - `extra_args` string[]: Extra arguments to pass directly to `qt-uic`
  - `method` string: The method to use to detect Qt, see [[dependency]]
  - `preserve_paths` bool: *New in 1.4.0*. If `true`, specifies that the output
    files need to maintain their directory structure inside the target temporary
    directory. For instance, when a file called `subdir/one.input` is processed
    it generates a file `{target private directory}/subdir/one.out` when `true`,
    and `{target private directory}/one.out` when `false` (default).

### compile_moc

*New in 0.59.0*

Compiles Qt's moc files (.moc) into header and/or source files. At least one of
the keyword arguments `headers` and `sources` must be provided.

It takes no positional arguments, and the following keyword arguments:
  - `sources` (File | string | custom_target | custom_target index | generator_output)[]:
    A list of sources to be transpiled into .moc files for manual inclusion.<br/>
    *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output.
  - `headers` (File | string | custom_target | custom_target index | generator_output)[]:
     A list of headers to be transpiled into .cpp files<br/>
    *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output.
  - `extra_args` string[]: Extra arguments to pass directly to `qt-moc`
  - `method` string: The method to use to detect Qt, see [[dependency]]
  - `dependencies`: dependency objects whose include directories are used by moc.
  - `include_directories` (string | IncludeDirectory)[]: A list of `include_directory()`
    objects used when transpiling the .moc files
  - `preserve_paths` bool: *New in 1.4.0*. If `true`, specifies that the output
    files need to maintain their directory structure inside the target temporary
    directory. For instance, when a file called `subdir/one.input` is processed
    it generates a file `{target private directory}/subdir/one.out` when `true`,
    and `{target private directory}/one.out` when `false` (default).
  - `output_json` bool: *New in 1.7.0*. If `true`, generates additionally a
    JSON representation which may be used by external tools such as qmltyperegistrar

### preprocess

Consider using `compile_resources`, `compile_ui`, and `compile_moc` instead.

Takes sources for moc, uic, and rcc, and converts them into c++ files for
compilation.

Has the following signature: `qt.preprocess(name: str | None, *sources: str)`

If the `name` parameter is passed then all of the rcc files will be written to
a single output file

*Deprecated in 0.59.0*: Files given in the variadic `sources` arguments as well
as the `sources` keyword argument, were passed unmodified through the preprocessor
programs. Don't do this - just add the output of `preprocess()` to another sources
list:
```meson
sources = files('a.cpp', 'main.cpp', 'bar.c')
sources += qt.preprocess(qresources : ['resources'])
```

This method takes the following keyword arguments:
 - `qresources` (string | File)[]: Passed to the RCC compiler
 - `ui_files`: (string | File | CustomTarget)[]: Passed the `uic` compiler
 - `moc_sources`: (string | File | CustomTarget)[]: Passed the `moc` compiler.
   These are converted into .moc files meant to be `#include`ed
 - `moc_headers`: (string | File | CustomTarget)[]: Passed the `moc` compiler.
   These will be converted into .cpp files
 - `include_directories` (IncludeDirectories | string)[], the directories to add
   to header search path for `moc`
 - `moc_extra_arguments` string[]: any additional arguments to `moc`.
 - `uic_extra_arguments` string[]: any additional arguments to `uic`.
 - `rcc_extra_arguments` string[]: any additional arguments to `rcc`.
 - `dependencies` Dependency[]: dependency objects needed by moc.
 - *Deprecated in 0.59.0.*: `sources`: a list of extra sources, which are added
   to the output unchanged.
 - `preserve_paths` bool: *Since 1.4.0*. If `true`, specifies that the output
   files need to maintain their directory structure inside the target temporary
   directory. For instance, when a file called `subdir/one.input` is processed
   it generates a file `{target private directory}/subdir/one.out` when `true`,
   and `{target private directory}/one.out` when `false` (default).
 - `moc_output_json` bool: *New in 1.7.0*. If `true`, generates additionally a
   JSON representation which may be used by external tools such as qmltyperegistrar

It returns an array of targets and sources to pass to a compilation target.

### compile_translations

This method generates the necessary targets to build translation files with
lrelease, it takes no positional arguments, and the following keyword arguments:

 - `ts_files` (File | string | custom_target | custom_target index | generator_output)[]:
    the list of input translation files produced by Qt's lupdate tool.<br/>
    *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output.
 - `install` bool: when true, this target is installed during the install step (optional).
 - `install_dir` string: directory to install to (optional).
 - `build_by_default` bool: when set to true, to have this target be built by
   default, that is, when invoking `meson compile`; the default value is false
   (optional).
 - `qresource` string: rcc source file to extract ts_files from; cannot be used
   with ts_files kwarg.
 - `rcc_extra_arguments` string[]: any additional arguments to `rcc` (optional),
   when used with `qresource`.

Returns either: a list of custom targets for the compiled
translations, or, if using a `qresource` file, a single custom target
containing the processed source file, which should be passed to a main
build target.

### has_tools

This method returns `true` if all tools used by this module are found,
`false` otherwise.

It should be used to compile optional Qt code:
```meson
qt6 = import('qt6')
if qt6.has_tools(required: get_option('qt_feature'))
  moc_files = qt6.preprocess(...)
  ...
endif
```

This method takes the following keyword arguments:
- `required` bool | FeatureOption: by default, `required` is set to `false`. If `required` is set to
  `true` or an enabled [`feature`](Build-options.md#features) and some tools are
  missing Meson will abort.
- `method` string: The method to use to detect Qt, see [[dependency]]
- `tools`: string[]: *Since 1.6.0*. List of tools to check. Testable tools
  are `moc`, `uic`, `rcc` and `lrelease`. By default `tools` is set to `['moc',
  'uic', 'rcc', 'lrelease']`
- `version` str | array[str]: *Since 1.11.0*. Specifies the required version,
  a string containing a comparison operator followed by the version string.

### qml_module

*New in 1.7.0*

This function requires one positional argument: the URI of the module as dotted
identifier string. For instance `Foo.Bar`

This method takes the following keyword arguments:

  - `version`: string: the module version in the form `Major.Minor` with an
    optional `.Patch`. For instance `1.0`
  - `qml_sources` (File | string | custom_target | custom_target index | generator_output)[]:
     A list of qml to be embedded in the module
  - `qml_singletons` (File | string | custom_target | custom_target index | generator_output)[]:
     A list of qml to be embedded in the module and marked as singletons
  - `qml_internals` (File | string | custom_target | custom_target index | generator_output)[]:
     A list of qml to be embedded in the module and marked as internal files
  - `resources_prefix` string: By default `resources_prefix` is set to
    `qt/qml`. Prefix resources in the generated QRC with the given prefix
  - `imports`: string[]: List of other QML modules imported by this module. Version
    can be specified as `Module/1.0` or `Module/auto`. See qmldir documentation
  - `optional_imports`: string[]: List of other QML modules that may be imported by this
    module. See `imports` for expected format and qmldir documentation
  - `default_imports`: string[]: List QML modules that may be loaded by
    tooling. See `imports` for expected format and qmldir documentation
  - `depends_imports`: string[]: List of QML extra dependencies that may not be
    imported by QML, such as dependencies existing in C++ code. See `imports` for
    expected format and qmldir documentation
  - `designer_supported` bool: If `true` specifies that the module supports Qt
    Quick Designer
  - `moc_headers` (File | string | custom_target | custom_target index | generator_output)[]:
     A list of headers to be transpiled into .cpp files. See [Qt
     documentation](https://doc.qt.io/qt-6/qtqml-cppintegration-definetypes.html)
     regarding how to register C++ class as Qml elements. Note: due to some
     limitations of qmltyperegistrar, all headers that declare QML types need to
     be accessible in the project's include path.
  - `namespace`: str: optional C++ namespace for plugin and generation code
  - `typeinfo`: str: optional name for the generated qmltype file, by default it
    will be generated as `{target_name}.qmltype`
  - `rcc_extra_arguments`: string[]: Extra arguments to pass directly to `qt-rcc`
  - `moc_extra_arguments`: string[]: Extra arguments to pass directly to `qt-moc`
  - `qmlcachegen_extra_arguments`: string[]: Extra arguments to pass directly to
    `qmlcachegen`
  - `qmltyperegistrar_extra_arguments`: string[]: Extra arguments to pass directly to
    `qmltyperegistrar`
  - `generate_qmldir`: bool: If `true` (default) auto generate the `qmldir` file
  - `generate_qmltype`: bool: If `true` (default) auto generate `qmltype` file
  - `cachegen`: bool: If `true` (default) preprocess QML and JS files with
    qmlcachegen
  - `method` string: The method to use to detect Qt, see [[dependency]]
  - `preserve_paths` bool: If `true`, specifies that the output
    files need to maintain their directory structure inside the target temporary
    directory. For instance, when a file called `subdir/one.input` is processed
    it generates a file `{target private directory}/subdir/one.out` when `true`,
    and `{target private directory}/one.out` when `false` (default).
  - `dependencies`: dependency objects whose include directories are used by
    moc.
  - `include_directories` (string | IncludeDirectory)[]: A list of `include_directory()`
    objects used when transpiling the .moc files
  - `install` bool: when true, this target is installed during the install step (optional).
  - `install_dir` string: directory to install to (optional).


Note: Qt uses static initialization to register its resources, if you're
building a static library you may need to call these entry points
explicitly. For a module `Foo.Bar42` the generated resources are `Foo_Bar42`
and `qmlcache_Foo_Bar42` when qmlcache is used, they can be imported using
`Q_INIT_RESOURCE`. All non-alphanumeric characters from the module name are
replaced with `_`. Type registration may be invoked explicitly using
`extern void qml_register_types_Foo_Bar42()`.

See [Qt documentation](https://doc.qt.io/qt-6/resources.html#explicit-loading-and-unloading-of-embedded-resources)
for more information
