The first argument to the `qt_add_qml_module()` function is *not* a new
target to be defined by the call.
You can also give it an existing target. See all our examples that first
create an executable target and then attach a QML module to it.
Furthermore, the `SOURCES` argument isn't a list of files that
are to be compiled into a new artefact (library or executable).
They are also compiled into your target. You don't have to list them
twice. All sources already present on the target will also be inspected
by moc and subsequently qmltyperegistrar.
It is also worth
noting that for the introspection only headers are needed, i.e. the
`SOURCES` argument to `at_add_qml_module()` only needs to list headers
that define QML types (those that use the `QML_ELEMENT`, typically).
Is this description accurate so far ?
No! Do add the sources. Otherwise you'll get unresolved symbols
somewhere down the line.
There are a few caveats I observed: The call to `qt_add_qml_module()`
has to occur in the same CMakeLists.txt file as the associated backing
target definition (e.g. `add_library()`), or else make complains about
missing symbols.
While it is probably a good idea to keep the target and the QML module
together, your missing symbols are probably due to missing source files.
Further, the `OUTPUT_DIRECTORY` argument to
`qt_add_qml_module()` seems to be required (at least if more than one
QML modules are defined).
No! Do not add a custom output directory unless you know exactly what
you are doing. The default output directory is fine in 99% of the cases
and will make it much easier to find the module at run time.
It is probably assumed that the structure of the QML modules matches the
structure of the underlying C++ libraries.
No! The structure of the QML modules matches their URIs. You put a
module my.fine.module into a directory at a path my/fine/module from the
directory of your executable. That, at least, is the easiest and
recommended way to do it. You can structure your C++ libraries whatever
way you like. If you need to expose a type from some other library in
your QML module there is QML_FOREIGN for that.
One thing that bothers me in particular is
that The classes that I want to reflect into QML are supposed to contain
the `QML_ELEMENT` macro, which I think is a bit intrusive.
You can use QML_FOREIGN to expose classes that don't have any QML macros
themselves.
All that being said, am I on the right track, or am I still
fundamentally misunderstanding how to use QML with Qt6 ?
Well ... maybe you want to read
https://doc.qt.io/qt-6/qtqml-writing-a-module.html
best,
Ulf
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest