| # 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 |