Как сделать свой модуль 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 файлы.
Появилось несколько вопросов:
Мне нужно qmldir как-то явно указывать в CMakeLists.txt? В плане, использовать QML_IMPORT_PATH переменную?
Мне нужно делать отдельный подпроект под стиль, то есть делать CMakeLists.txt где qt_add_qml_module будет?
Мне нужно добавить в 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 шт):
Нашел все же как его сделать, наконец, оставлю тут ответ, может быть кому-то понадобится.
Нужно было создать просто 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
.