Building reusable Qt6 Qml Module with CMake
Unsolved
Qt 6
-
Hello
So I've been trying to create a reusable module that I can use across my apps.
the module is structred like that├── CMakeLists.txt └── examples ├── CMakeLists.txt └── demo ├── CMakeLists.txt ├── main.cpp ├── main.qml └── src ├── CMakeLists.txt ├── Extra.qml
top level CMakeLists
cmake_minimum_required(VERSION 3.16) project(mymodule VERSION 0.1 LANGUAGES CXX) set(CMAKE_AUTOMOC ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 6.2 COMPONENTS Quick REQUIRED) add_subdirectory(src) add_subdirectory(examples)
src's CMakeLists
qt_add_library(mymodule STATIC) qt_add_qml_module(mymodule URI MyModule VERSION 1.0 RESOURCE_PREFIX "/qt-project.org/imports" IMPORT_PATH "/qt-project.org/imports" QML_FILES Extra.qml )
examples CMakeLists
add_subdirectory(demo)
demo's CMakeLists
cmake_minimum_required(VERSION 3.14) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Quick) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Quick) qt_add_executable(appdemo main.cpp ) qt_add_qml_module(appdemo URI Demo VERSION 1.0 IMPORTS MyModule QML_FILES main.qml ) set_target_properties(appdemo PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) target_compile_definitions(appdemo PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>) target_link_libraries(appdemo PRIVATE Qt6::Quick mymoduleplugin)
demo's main.cpp
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QDebug> #include <QtQml/qqmlextensionplugin.h> Q_IMPORT_QML_PLUGIN(MyModulePlugin) int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; qDebug()<<engine.importPathList(); const QUrl url(u"qrc:/Demo/main.qml"_qs); qDebug()<<engine.importPathList(); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); }
demo's main.qml
import QtQuick import QtQuick.Window import QtQuick.Controls import MyModule ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("Demo") visibility: Window.Maximized Extra{ } }
now everything compiles and works fine,
except that qtcreator complains that MyModule is not foundQML module not found (MyModule).
what I'm I missing here?
please note that if "src" where inside the demo's directory and included it with add_subdirectory(src) it would work fine, but this will mess with the directory strucuture.you can download the project from this link