qt_generate_foreign_qml_types

Registers types from one target in a QML module.

The command is defined in the Qml 组件对于 Qt6 package, which can be loaded like so:

find_package(Qt6 REQUIRED COMPONENTS Qml)
					

概要

qt_generate_foreign_qml_types(
    source_target
    destination_qml_target
)
					

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

描述

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)
					

注意: 在以上范例中, 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.

注意: 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 .