我正在学习 qml 并想制作自己的风格(https://doc.qt.io/qt-6/qtquickcontrols-customize.html如此处所示)。我制作了一个 qmldir 文件,将应用程序和样式 qml 文件分开,以制作我所理解的模块。也就是说,我在 App 文件夹中有应用程序文件,在 QutyStyle 文件夹中有样式。但是在编译时,QQmlApplicationEngine 告诉我没有安装 QutyStyle 模块。我开始谷歌搜索,最后我什么也做不了。我通过 QQmlApplicationEngine::appImportPath 添加了 qml 文件夹的路径,但它没有执行任何操作。我还决定查看应用程序中加载的所有 qrc,但没有找到 qmldir。当我尝试将其添加到 CMakeLists.txt 中的 QML_FILES 时,我收到一条警告,指出只有 .qml 和 .js 文件可以在那里。
出现了几个问题:
我需要在 CMakeLists.txt 中显式指定 qmldir 吗?在使用 QML_IMPORT_PATH 变量方面?
我是否需要为该样式创建一个单独的子项目,即在 qt_add_qml_module 所在位置创建 CMakeLists.txt ?
我需要将我的样式添加到 QQmlApplicationEngine 中的导入路径吗?
基本上,我该怎么做?下面我附加了文件 CMakeLists.txt 和 main.cpp
这就是带有 qml 的树的样子,在客户端文件夹(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)
主程序
#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();
}



