Files
FancyInput-Qt/CMakeLists.txt
T
2026-08-20 23:33:33 +08:00

154 lines
5.6 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(用户自定义控件,≈ 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/<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 风格(程序显式锁定 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()