Files
FancyInput-Qt/CMakeLists.txt
T
2026-08-20 11:59:03 +08:00

134 lines
4.9 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)
# ============ Qt 依赖(6.8.3 MinGW,LGPL v3 动态链接) ============
find_package(Qt6 6.8 REQUIRED COMPONENTS
Core Gui Qml Quick QuickControls2
)
# QTP0001: QML 资源前缀为 :/qt/qml/<URI>/
# QTP0004: QML 文件统一由 qt_add_qml_module 管理,无需手写 qmldir
qt_policy(SET QTP0001 NEW)
qt_policy(SET QTP0004 NEW)
# QML 模块统一输出到 build/<config>/<URI路径>/(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(用户自定义控件) ============
# 控件文件放在 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:FancyInputQt(App 主界面) ============
qt_add_qml_module(FancyInputQt
URI FancyInputQt
VERSION 1.0
QML_FILES
src/qml/Main.qml
DEPENDENCIES
FancyInputControls
)
# ============ 链接 ============
target_link_libraries(FancyInputQt PRIVATE
FancyInputControls # 控件模块(含 QML 资源)
FancyInputControlsplugin # 控件模块的静态插件,必须链接,否则运行时找不到模块
Qt6::Core Qt6::Gui Qt6::Qml Qt6::Quick Qt6::QuickControls2
)
# ============ 输出目录 ============
# exe 输出到 bin/<config>,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"
"$<TARGET_FILE:FancyInputQt>"
COMMENT "部署 Qt 运行库")
# 2. 体积优化:删除未使用的 Qt 组件
set(DEPLOY_DIR "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}")
# 2.1 未使用的 QuickControls2 风格(默认只需 Windows/Basic/Fusion)
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()