154 lines
5.6 KiB
CMake
154 lines
5.6 KiB
CMake
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()
|