cmake_minimum_required(VERSION 3.16) project(FancyInputQt VERSION 1.2.0 DESCRIPTION "FancyInput 输入模拟/宏工具 - Qt 迁移版" LANGUAGES C CXX ) # ============ 全局编译设置 ============ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) # ============ Qt 依赖(6.8.3 MinGW,LGPL v3 动态链接) ============ find_package(Qt6 6.8 REQUIRED COMPONENTS Core Gui Qml Quick QuickControls2 ) # QTP0001: QML 资源前缀为 :/qt/qml// # QTP0004: QML 文件统一由 qt_add_qml_module 管理,无需手写 qmldir qt_policy(SET QTP0001 NEW) qt_policy(SET QTP0004 NEW) # QML 模块统一输出到 build///(qmlls/qmllint 依赖此布局才能找到模块) # 必须在 qt_add_qml_module 之前设置 set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") # ============ 主程序 ============ qt_add_executable(FancyInputQt src/main.cpp ) # ============ QML 模块 1:FancyInput.Controls(用户自定义控件,≈ WPF UserControl) ============ # 控件文件放在 src/qml/controls/ 目录下,GLOB 自动收集: # 以后新增控件只需放 .qml 文件,无需修改本文件。 file(GLOB CONTROLS_QML_FILES CONFIGURE_DEPENDS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "src/qml/controls/*.qml" ) # Theme.qml 是 QML 单例(pragma Singleton),需显式声明 set_source_files_properties( src/qml/controls/Theme.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE ) qt_add_qml_module(FancyInputControls STATIC # 编译为静态库,链接进 exe,无需额外部署 DLL URI FancyInput.Controls VERSION 1.0 QML_FILES ${CONTROLS_QML_FILES} ) # ============ QML 模块 2:FancyInput.Windows(窗口组件,≈ WPF Window) ============ # 窗口文件放在 src/qml/windows/ 目录下,GLOB 自动收集: # 以后新增窗口只需放 .qml 文件,无需修改本文件。 file(GLOB WINDOWS_QML_FILES CONFIGURE_DEPENDS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "src/qml/windows/*.qml" ) qt_add_qml_module(FancyInputWindows STATIC # 编译为静态库,链接进 exe URI FancyInput.Windows VERSION 1.0 QML_FILES ${WINDOWS_QML_FILES} DEPENDENCIES FancyInputControls # 窗口里会用自定义控件 ) # ============ QML 模块 3:FancyInputQt(App 主界面) ============ qt_add_qml_module(FancyInputQt URI FancyInputQt VERSION 1.0 QML_FILES src/qml/Main.qml # 主界面内容(Rectangle 根,可可视化编辑) src/qml/MainWindow.qml # 主窗口包装(Window 根) DEPENDENCIES FancyInputControls FancyInputWindows ) # ============ 链接 ============ target_link_libraries(FancyInputQt PRIVATE FancyInputControls # 控件模块(含 QML 资源) FancyInputWindows # 窗口模块(含 QML 资源) Qt6::Core Qt6::Gui Qt6::Qml Qt6::Quick Qt6::QuickControls2 ) # ============ 输出目录 ============ # exe 输出到 bin/,build/ 只留中间产物(须在 qt_add_qml_module 之后设置) set_target_properties(FancyInputQt PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}" ) # ============ 部署:windeployqt 拷贝 Qt 运行库 + 裁剪未使用组件 ============ if(WIN32) find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${QT6_INSTALL_PREFIX}/bin" REQUIRED) # 1. 拷贝所需 Qt DLL/插件/QML 到 exe 旁 add_custom_command(TARGET FancyInputQt POST_BUILD COMMAND "${WINDEPLOYQT_EXECUTABLE}" --no-translations --no-system-d3d-compiler --no-opengl-sw --skip-plugin-types qmltooling --qmldir "${CMAKE_SOURCE_DIR}/src/qml" "$" COMMENT "部署 Qt 运行库") # 2. 体积优化:删除未使用的 Qt 组件 set(DEPLOY_DIR "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}") # 2.1 未使用的 QuickControls2 风格(程序显式锁定 Basic,其余全部可删) set(UNUSED_STYLES "${DEPLOY_DIR}/qml/QtQuick/Controls/FluentWinUI3" "${DEPLOY_DIR}/qml/QtQuick/Controls/Material" "${DEPLOY_DIR}/qml/QtQuick/Controls/Universal" "${DEPLOY_DIR}/qml/QtQuick/Controls/Imagine" "${DEPLOY_DIR}/Qt6QuickControls2FluentWinUI3StyleImpl.dll" "${DEPLOY_DIR}/Qt6QuickControls2Material.dll" "${DEPLOY_DIR}/Qt6QuickControls2MaterialStyleImpl.dll" "${DEPLOY_DIR}/Qt6QuickControls2Universal.dll" "${DEPLOY_DIR}/Qt6QuickControls2UniversalStyleImpl.dll" "${DEPLOY_DIR}/Qt6QuickControls2Imagine.dll" "${DEPLOY_DIR}/Qt6QuickControls2ImagineStyleImpl.dll") # 2.2 Qt6VirtualKeyboard(GPL v3 禁止闭源商用,本工程未使用) set(GPL_COMPONENTS "${DEPLOY_DIR}/qml/QtQuick/VirtualKeyboard" "${DEPLOY_DIR}/Qt6VirtualKeyboard.dll" "${DEPLOY_DIR}/platforminputcontexts/qtvirtualkeyboardplugin.dll") # 2.3 其他未使用组件 set(UNUSED_MISC "${DEPLOY_DIR}/tls" "${DEPLOY_DIR}/generic" "${DEPLOY_DIR}/imageformats/qgif.dll" "${DEPLOY_DIR}/imageformats/qicns.dll" "${DEPLOY_DIR}/imageformats/qtga.dll" "${DEPLOY_DIR}/imageformats/qtiff.dll" "${DEPLOY_DIR}/imageformats/qwbmp.dll" "${DEPLOY_DIR}/imageformats/qwebp.dll") add_custom_command(TARGET FancyInputQt POST_BUILD COMMAND ${CMAKE_COMMAND} -E rm -rf ${UNUSED_STYLES} COMMAND ${CMAKE_COMMAND} -E rm -rf ${GPL_COMPONENTS} COMMAND ${CMAKE_COMMAND} -E rm -rf ${UNUSED_MISC} COMMENT "体积优化: 裁剪未使用的 Qt 组件") endif()