Files
FancyInput-Qt/CMakeLists.txt
T
2026-08-19 23:18:08 +08:00

146 lines
6.3 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
# ---- 输出目录策略 ----
# build/<preset>:仅存放 CMake 中间产物(编译对象、Makefile、生成的 QML 模块等)
# bin/<config> :最终产物(exe + Qt DLL + 插件),由 windeployqt 部署,开箱即用
# 注意:不能用全局 CMAKE_RUNTIME_OUTPUT_DIRECTORY —— 已验证它会破坏
# qt_add_qml_module 的 QML 模块嵌入,运行时报 "Module FancyInputQt contains no type named Main"。
# 必须用 per-target 属性且放在 qt_add_qml_module 之后设置(见下方 target_link_libraries 后)。
# Qt 6.8.3 MinGW 套件(LGPL v3 动态链接,可免费商用)
find_package(Qt6 6.8 REQUIRED COMPONENTS
Core
Gui
Qml
Quick
QuickControls2
)
# QTP0004: QML 文件统一由 qt_add_qml_module 管理,无需额外 qmldir
qt_policy(SET QTP0004 NEW)
# QTP0001: QML 模块资源前缀使用 :/qt/qml/<URI>/(如 :/qt/qml/FancyInputQt/、:/qt/qml/FancyInput/Controls/),
# main.cpp 中已 addImportPath("qrc:/") 使内嵌模块可被发现
qt_policy(SET QTP0001 NEW)
# ---- 阶段 0:Hello World 工程骨架 ----
# 后续阶段:输入识别核心 → 通用函数 → 主界面 → 分窗口 → 延后功能
qt_add_executable(FancyInputQt
src/main.cpp
)
# ---- 用户控件模块 FancyInput.Controls(独立静态库) ----
# 自定义控件/主题统一放这里,App 主界面通过 `import FancyInput.Controls` 使用,
# 与 Qt 内置模块解耦,后续扩展新控件只需往 src/qml/controls/ 目录加 .qml 文件。
# URI 用点分命名空间(FancyInput.Controls),避免与主模块/第三方库撞名。
# 注意:Theme.qml 用 pragma Singleton,必须通过 QT_QML_SINGLETON_TYPE
# 源文件属性显式声明(qt_add_qml_module 只自动识别 .pragma library,
# 不会自动检测 pragma Singleton —— 见 Qt6QmlMacros.cmake 3292 行)。
qt_add_library(FancyInputControls STATIC)
set_source_files_properties(
src/qml/controls/Theme.qml
PROPERTIES QT_QML_SINGLETON_TYPE TRUE
)
qt_add_qml_module(FancyInputControls
URI FancyInput.Controls
VERSION 1.0
QML_FILES
src/qml/controls/Theme.qml
)
# ---- 主入口 QML 模块(App 自身,URI 与 exe 同名用于内嵌发现) ----
qt_add_qml_module(FancyInputQt
URI FancyInputQt
VERSION 1.0
QML_FILES
src/qml/Main.qml
DEPENDENCIES
FancyInputControls
)
target_link_libraries(FancyInputQt PRIVATE
FancyInputControls
FancyInputControlsplugin
Qt6::Core
Qt6::Gui
Qt6::Qml
Qt6::Quick
Qt6::QuickControls2
)
# ---- 输出目录:per-target 设置(必须在 qt_add_qml_module 之后) ----
# exe 直接输出到 bin/<config>,build/ 只留中间产物
set_target_properties(FancyInputQt PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}"
)
# ---- 构建后自动部署 Qt DLL 到 bin/<config>(LGPL 动态链接) ----
# 用 Qt 官方 windeployqt 把所需 DLL + 插件 + QML 依赖拷到 exe 旁,
# 保证 bin/ 目录开箱即用(双击即可运行,无需依赖 PATH)。
#
# 体积优化(已验证,Release 从 ~63MB 减到 ~46MB):
# 1. --skip-plugin-types qmltooling -> 跳过 QML 调试插件(仅开发用)
# 2. 部署后删除未使用的 QuickControls2 风格:
# FluentWinUI3(4.8MB)/Material/Universal/Imagine —— 默认只加载 Windows/Basic/Fusion
# 3. 删除未使用模块:tls(OpenSSL)、generic(触摸屏)、多余 imageformats
# 4. 强制删除 Qt6VirtualKeyboard(GPL v3,禁止用于闭源商用!本工程未使用它,
# 只是被 windeployqt 隐式部署进来)—— 见下方裁剪命令
if(WIN32)
find_program(WINDEPLOYQT_EXECUTABLE windeployqt
HINTS "${QT6_INSTALL_PREFIX}/bin"
REQUIRED)
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"
"$<TARGET_FILE:FancyInputQt>"
COMMENT "windeployqt: 部署 Qt 运行库到 bin/<config>")
# 部署后裁剪未使用的 Qt 模块/插件(体积优化)
set(DEPLOY_DIR "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}")
add_custom_command(TARGET FancyInputQt POST_BUILD
COMMAND ${CMAKE_COMMAND} -E rm -rf
"${DEPLOY_DIR}/qml/QtQuick/Controls/FluentWinUI3"
"${DEPLOY_DIR}/qml/QtQuick/Controls/Material"
"${DEPLOY_DIR}/qml/QtQuick/Controls/Universal"
"${DEPLOY_DIR}/qml/QtQuick/Controls/Imagine"
COMMAND ${CMAKE_COMMAND} -E rm -f
"${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"
COMMAND ${CMAKE_COMMAND} -E rm -rf
"${DEPLOY_DIR}/tls"
"${DEPLOY_DIR}/generic"
# Qt6VirtualKeyboard = GPL v3,禁止闭源商用,且本工程未使用 —— 强制删除
COMMAND ${CMAKE_COMMAND} -E rm -rf
"${DEPLOY_DIR}/qml/QtQuick/VirtualKeyboard"
COMMAND ${CMAKE_COMMAND} -E rm -f
"${DEPLOY_DIR}/Qt6VirtualKeyboard.dll"
"${DEPLOY_DIR}/platforminputcontexts/qtvirtualkeyboardplugin.dll"
COMMAND ${CMAKE_COMMAND} -E rm -f
"${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"
COMMENT "体积优化: 删除未使用的 Qt 风格/插件 + GPL 的 VirtualKeyboard")
endif()