- Qt 6.5
- Qt QML
- qt_generate_foreign_qml_types
- Qt 6.5.3 Reference Documentation

# qt_generate_foreign_qml_types

Registers types from one target in a QML module.

The command is defined in the `Qml` component of the `Qt6` package, which can be loaded like so:

     find_package(Qt6 REQUIRED COMPONENTS Qml)

## Synopsis

     qt_generate_foreign_qml_types(
         source_target
         destination_qml_target
     )

If versionless commands are disabled, use `qt6_generate_foreign_qml_types()` instead. It supports the same set of arguments as this command.

## Description

`qt_generate_foreign_qml_types` extracts types marked via QML registration macros (like QML_ELEMENT) from `source_target` and registers them as foreign types in the QML module `destination_qml_target`.

This can be useful when one wants to create a library with optional QML integration, without depending directly on QML.

     // myclass.h
     #include <QtQmlIntegration/qqmlintegration.h>

     class MyClass : public QObject
     {
         QML_ELEMENT
         Q_OBJECT

         // [...]
     };

     # CMakeLists.txt
     qt_add_library(mylib myclass.h ...)
     target_link_libraries(mylib PRIVATE Qt::Core Qt::QmlIntegration)

     qt_add_qml_module(mylib_declarative
       VERSION 1.0
       URI "mylib"
       ...
     )
     qt_generate_foreign_qml_types(mylib mylib_declarative)

Note: In the example above, `mylib` does not depend on QtQml or QtQuick, but only on the header-only QmlIntegration target (for the QtQmlIntegration/qqmlintegration.h header, which provides the `QML_ELEMENT` macro).

The effect is equivalent to using `QML_FOREIGN` with custom structs in the QML library to expose the types.

Note: In order to implement custom behavior, such as exposing an existing singleton instance with its own life cycle to QML, you should add custom types to your QML library (mylib_declarative in the above example). In turn, you should omit the QML_ELEMENT and similar macros from the original C++ classes so that qt_generate_foreign_qml_types() does not generate more QML integration structs for them. The QML macros, as well as any singleton factory functions, can be added to the structs that contain the QML_FOREIGN.