RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1594589
Accepted
questions.Bloody.cpp
questions.Bloody.cpp
Asked:2024-09-23 04:36:53 +0000 UTC2024-09-23 04:36:53 +0000 UTC 2024-09-23 04:36:53 +0000 UTC

如何制作自己风格的qml模块?

  • 772

我正在学习 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 文件可以在那里。

出现了几个问题:

  1. 我需要在 CMakeLists.txt 中显式指定 qmldir 吗?在使用 QML_IMPORT_PATH 变量方面?

  2. 我是否需要为该样式创建一个单独的子项目,即在 qt_add_qml_module 所在位置创建 CMakeLists.txt ?

  3. 我需要将我的样式添加到 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();
}
c++
  • 1 1 个回答
  • 28 Views

1 个回答

  • Voted
  1. Best Answer
    questions.Bloody.cpp
    2024-09-25T07:00:07Z2024-09-25T07:00:07Z

    我终于找到了怎么做,我将答案留在这里,也许有人会需要它

    有必要简单地在包含 .qml 文件的目录中创建一个 CMakeLists.txt 文件(即在我的情况下在 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中的第一个参数

    不需要显式设置target,即不写project..,qt_add_qml_module本身使第一个参数名称的target作为库

    qmldir 文件也不是必需的,qt_add_qml_module 本身就像 qmltypes 文件一样

    • 0

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5