Как сделать свой модуль qml с стилем?

Изучаю qml и захотел сделать свой стиль (https://doc.qt.io/qt-6/qtquickcontrols-customize.html как указано здесь). Сделал я файл qmldir, разделил qml файлы приложения и стиля чтобы сделать модуль как я понимаю. То есть в папке App у меня файлы приложения, а в папке QutyStyle стиль. Но при компиляции мне выдает QQmlApplicationEngine что модуль QutyStyle не установлен. Начал гуглить, и по итогу ничего не смог сделать. Я добавил через QQmlApplicationEngine::appImportPath путь к папке qml, но это ничего не дало. Также я решил посмотреть все qrc которые загружены в приложении, и не нашел файл qmldir. А при попытке добавить его в QML_FILES в моем CMakeLists.txt мне выдало предупреждение что там могут находиться только .qml и .js файлы.

Появилось несколько вопросов:

  1. Мне нужно qmldir как-то явно указывать в CMakeLists.txt? В плане, использовать QML_IMPORT_PATH переменную?

  2. Мне нужно делать отдельный подпроект под стиль, то есть делать CMakeLists.txt где qt_add_qml_module будет?

  3. Мне нужно добавить в import path в QQmlApplicationEngine мой стиль?

В общем, как мне это вообще сделать? Ниже приложил файлы CMakeLists.txt и main.cpp

Так выглядит дерево с qml, в папке client (где находидтся папка qml) лежит CMakeLists.txt

CMakeLists.txt

cmake_minimum_required(VERSION 3.6)
project(quty-client)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOUIC_SEARCH_PATHS ui/)

find_package(Qt6 COMPONENTS Core Widgets Gui Sql Concurrent Network Quick REQUIRED)
qt_standard_project_setup(REQUIRES 6.7)

#Search for sources files
file(GLOB_RECURSE QUTY_CLIENT_SOURCE_FILES * ./share/*)

#Search qml/js files in qml folder
file(GLOB_RECURSE APP_QML_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} qml/*.qml qml/*.js)
file(GLOB_RECURSE ASSETS_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} qml/assets/*)

foreach(file ${APP_QML_FILES})
    message(STATUS ${file})
endforeach()

qt_add_executable(quty-client 
    ${QUTY_CLIENT_SOURCE_FILES} ${APP_QML_FILES} ${ASSETS_FILES}) 

qt_add_qml_module(quty-client
    URI quty
    VERSION 1.0
    QML_FILES
        ${APP_QML_FILES}
    RESOURCES
        ${ASSETS_FILES}
)

include_directories(quty-client ../share/)
target_link_libraries(quty-client PRIVATE Qt6::Widgets Qt6::Quick Qt6::Gui Qt6::Core Qt6::Sql Qt6::Network Qt6::Concurrent)

main.cpp

#include <QApplication>
#include <QtGlobal>
#include <QtWidgets>
#include <QtQml>
#include <QStyle>

#include <Window.h>
#include <iostream>

using namespace quty;

int main(int argc, char** argv){
    QGuiApplication app(argc, argv);
    QFontDatabase::addApplicationFont("qrc:/assets/JetBrainsMono-Medium.ttf");
    QGuiApplication::setFont(QFont("JetBrains Mono Medium", 16));
    qRegisterMetaType<quty::Message>();
    qRegisterMetaType<quty::Channel>();
    qRegisterMetaType<quty::Reply>();
    qRegisterMetaType<quty::UserProfile>();
    QDirIterator it(":", QDirIterator::Subdirectories);
    while (it.hasNext()) {
        qDebug() << it.next();
    }
    QQmlApplicationEngine engine;
    engine.addImportPath("qrc:/qt/qml/quty/qml");
    engine.load((QUrl("qrc:/qt/qml/quty/qml/App/Main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}

Ответы (1 шт):

Автор решения: questions.Bloody.cpp

Нашел все же как его сделать, наконец, оставлю тут ответ, может быть кому-то понадобится.

Нужно было создать просто CMakeLists.txt файл в директории с файлами .qml (То есть в QutyStyle в моем случае) и добавить там модуль:

file(GLOB_RECURSE APP_QML_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.qml *.js)
file(GLOB_RECURSE ASSETS_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ../qml/assets/*)

cmake_policy(SET CMP0071 NEW) #CMake тут выдавал предупреждение что нужно указать использование moc для сгенерированных файлов

qt_add_qml_module(QutyStyle
    URI QutyStyle
    VERSION 1.0
    QML_FILES
        ${APP_QML_FILES}
    RESOURCES
        ${ASSETS_FILES}
)

URI надо задавать как относительный путь от главного CMakeLists.txt, только вместо слешей точка. У меня в данный момент папка модуля лежит вместе с файлом CMake-а, потому я просто написал QutyStyle, если использовать дерево файлов как в моем вопросе, то было бы qml.QutyStyle.

А в главном файле CMake надо указать add_subdirectory где лежит модуль, и в target_link_libraries добавить название модуля, то есть первый аргумент в qt_add_qml_module.

Никак явно задавать таргет при этом не нужно, то есть не писать project.., qt_add_qml_module сам делает цель с названием первого аргумента как библиотеку.

qmldir файл также не нужен, qt_add_qml_module делает его сам, как и файл qmltypes.

→ Ссылка