From e544313a9f9bd46148a16d20d309bd10d31d20ba Mon Sep 17 00:00:00 2001 From: Liu Zhangjian Date: Tue, 16 Dec 2025 21:26:33 +0800 Subject: [PATCH] feat: add Qt5 and Qt6 dual version support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Added automatic Qt version detection in CMakeLists.txt to support both Qt5 and Qt6 2. Modified CMake configuration to use dynamic Qt version variables instead of hardcoded Qt6 3. Updated debian/control to include Qt5 package alternatives for build dependencies 4. Enhanced debian/rules to detect available Qt version and set appropriate QT_DIR 5. This change allows the project to build on systems with either Qt5 or Qt6 installed Log: Added support for both Qt5 and Qt6 versions Influence: 1. Test building on systems with only Qt5 installed 2. Test building on systems with only Qt6 installed 3. Verify application functionality on both Qt5 and Qt6 environments 4. Check that all UI components render correctly in both versions 5. Test device formatting functionality remains consistent across Qt versions feat: 添加 Qt5 和 Qt6 双版本支持 1. 在 CMakeLists.txt 中添加自动 Qt 版本检测,支持 Qt5 和 Qt6 2. 修改 CMake 配置使用动态 Qt 版本变量替代硬编码的 Qt6 3. 更新 debian/control 包含 Qt5 包替代方案用于构建依赖 4. 增强 debian/rules 以检测可用 Qt 版本并设置合适的 QT_DIR 5. 此更改允许项目在安装 Qt5 或 Qt6 的系统上构建 Log: 新增对 Qt5 和 Qt6 双版本的支持 Influence: 1. 在仅安装 Qt5 的系统上测试构建 2. 在仅安装 Qt6 的系统上测试构建 3. 验证应用在 Qt5 和 Qt6 环境下的功能 4. 检查所有 UI 组件在两个版本中是否正确渲染 5. 测试设备格式化功能在 Qt 版本间保持一致 TASK: https://pms.uniontech.com/task-view-383509.html --- CMakeLists.txt | 105 ++++++++++++++++++++++++++++++++++--------------- debian/control | 18 ++++----- debian/rules | 14 +++++-- main.cpp | 8 +++- 4 files changed, 99 insertions(+), 46 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bd3ae4b..79b7849 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,11 +10,25 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # 包含 GNUInstallDirs,用于获取标准安装路径 include(GNUInstallDirs) +# Find Qt version +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) +message(" >>> Found Qt version: ${QT_VERSION_MAJOR}") + +if (QT_VERSION_MAJOR MATCHES 6) + set(DTK_VERSION_MAJOR 6) +else() + set(DTK_VERSION_MAJOR "") +endif() + # 查找必要的包 -find_package(Qt6 COMPONENTS Core Gui Widgets Concurrent Network DBus LinguistTools REQUIRED) -find_package(Dtk6 COMPONENTS Widget Gui REQUIRED) -find_package(udisks2-qt6 REQUIRED) +set(QT_COMPONENTS Core Gui Widgets Concurrent Network DBus LinguistTools) +if (QT_VERSION_MAJOR MATCHES 5) + list(APPEND QT_COMPONENTS X11Extras) +endif() +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS ${QT_COMPONENTS} REQUIRED) +find_package(Dtk${DTK_VERSION_MAJOR} COMPONENTS Widget Gui REQUIRED) find_package(PkgConfig REQUIRED) +pkg_check_modules(UDISKS2QT REQUIRED IMPORTED_TARGET udisks2-qt${QT_VERSION_MAJOR}) pkg_check_modules(PKGS REQUIRED x11 ) @@ -52,20 +66,39 @@ set(HEADERS # 设置翻译文件 file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/translations/${PROJECT_NAME}*.ts") -# 使用 Qt 提供的翻译工具 -qt_add_translations(${PROJECT_NAME} - # 指定翻译源文件 - TS_FILES ${TS_FILES} - # 指定 QM 文件输出变量 - QM_FILES_OUTPUT_VARIABLE QM_FILES - # 指定源文件,用于更新翻译 - SOURCES ${SOURCES} ${HEADERS} - # 指定 LRELEASE 选项 - LRELEASE_OPTIONS - -compress - -nounfinished - -removeidentical -) +# 根据 Qt 版本使用不同的翻译工具 +if (QT_VERSION_MAJOR MATCHES 6) + # Qt6 使用 qt_add_translations + qt_add_translations(${PROJECT_NAME} + # 指定翻译源文件 + TS_FILES ${TS_FILES} + # 指定 QM 文件输出变量 + QM_FILES_OUTPUT_VARIABLE QM_FILES + # 指定源文件,用于更新翻译 + SOURCES ${SOURCES} ${HEADERS} + # 指定 LRELEASE 选项 + LRELEASE_OPTIONS + -compress + -nounfinished + -removeidentical + ) +else() + # Qt5 手动生成 QM 文件 + find_program(QT_LRELEASE_EXECUTABLE NAMES lrelease-qt5 lrelease) + set(QM_FILES) + foreach(TS_FILE ${TS_FILES}) + get_filename_component(TS_FILE_NAME ${TS_FILE} NAME_WE) + set(QM_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TS_FILE_NAME}.qm") + add_custom_command( + OUTPUT ${QM_FILE} + COMMAND ${QT_LRELEASE_EXECUTABLE} -compress -nounfinished -removeidentical ${TS_FILE} -qm ${QM_FILE} + DEPENDS ${TS_FILE} + COMMENT "Generating ${QM_FILE} from ${TS_FILE}" + ) + list(APPEND QM_FILES ${QM_FILE}) + endforeach() + add_custom_target(translations ALL DEPENDS ${QM_FILES}) +endif() # 在文件开头部分添加自动 moc 处理 set(CMAKE_AUTOMOC ON) @@ -79,23 +112,31 @@ add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${PKGS_INCLUDE_DIRS} + ${UDISKS2QT_INCLUDE_DIRS} ) # 链接库 target_link_libraries(${PROJECT_NAME} PRIVATE - Qt6::Core - Qt6::Gui - Qt6::GuiPrivate - Qt6::Widgets - Qt6::Concurrent - Qt6::Network - Qt6::DBus - Dtk6::Widget - Dtk6::Gui - udisks2-qt6::udisks2-qt6 + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::GuiPrivate + Qt${QT_VERSION_MAJOR}::Widgets + Qt${QT_VERSION_MAJOR}::Concurrent + Qt${QT_VERSION_MAJOR}::Network + Qt${QT_VERSION_MAJOR}::DBus + Dtk${DTK_VERSION_MAJOR}::Widget + Dtk${DTK_VERSION_MAJOR}::Gui + PkgConfig::UDISKS2QT ${PKGS_LIBRARIES} ) +# Qt5 需要链接 X11Extras +if (QT_VERSION_MAJOR MATCHES 5) + target_link_libraries(${PROJECT_NAME} PRIVATE + Qt${QT_VERSION_MAJOR}::X11Extras + ) +endif() + # 添加编译选项 target_compile_options(${PROJECT_NAME} PRIVATE ${PKGS_CFLAGS_OTHER}) @@ -103,21 +144,21 @@ target_compile_options(${PROJECT_NAME} PRIVATE ${PKGS_CFLAGS_OTHER}) set(TRANSLATIONS_INSTALL_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}/translations") # 添加编译定义,传递安装路径到代码中 -target_compile_definitions(${PROJECT_NAME} PRIVATE +target_compile_definitions(${PROJECT_NAME} PRIVATE "TRANSLATIONS_DIR=\"${TRANSLATIONS_INSTALL_DIR}\"" ) # 安装目标 -install(TARGETS ${PROJECT_NAME} +install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) # 安装翻译文件 -install(FILES ${QM_FILES} +install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/translations ) # 安装桌面文件 -install(FILES dde-device-formatter.desktop +install(FILES dde-device-formatter.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications -) +) diff --git a/debian/control b/debian/control index 284ee94..2d2cda3 100644 --- a/debian/control +++ b/debian/control @@ -4,15 +4,15 @@ Priority: optional Maintainer: Deepin Packages Builder Build-Depends: cmake, debhelper (>=9), - qt6-base-dev, - qt6-declarative-dev, - qt6-tools-dev, - qt6-tools-dev-tools, - qt6-base-private-dev, - libdtk6widget-dev, - libdtk6gui-dev, - libdtk6core-dev, - libudisks2-qt6-dev + qt6-base-dev | qtbase5-dev, + qt6-declarative-dev | qtdeclarative5-dev, + qt6-tools-dev | qttools5-dev, + qt6-tools-dev-tools | qttools5-dev-tools, + qt6-base-private-dev | qtbase5-private-dev, + libdtk6widget-dev | libdtkwidget-dev, + libdtk6gui-dev | libdtkgui-dev, + libdtk6core-dev | libdtkcore-dev, + libudisks2-qt6-dev | libudisks2-qt5-dev Standards-Version: 3.9.8 Homepage: http://www.deepin.org diff --git a/debian/rules b/debian/rules index 9ba761f..87cf3c5 100755 --- a/debian/rules +++ b/debian/rules @@ -1,13 +1,21 @@ #!/usr/bin/make -f -export QT_SELECT=5 include /usr/share/dpkg/default.mk - DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH) + +# 检测当前安装的Qt版本,优先使用Qt6,否则使用Qt5 +define detect_qt_version +ifneq (,$(shell which qmake6 2>/dev/null)) + QT_DIR="/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/Qt6" +else + QT_DIR="/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/Qt5" +endif +endef + export DEB_LDFLAGS_APPEND = -Wl,-z,now %: dh $@ --parallel override_dh_auto_configure: - dh_auto_configure -- VERSION=$(VERSION) LIB_INSTALL_DIR=/usr/lib/$(DEB_HOST_MULTIARCH) DEFINES+="VERSION=$(DEB_VERSION_UPSTREAM)" + dh_auto_configure -- VERSION=$(VERSION) LIB_INSTALL_DIR=/usr/lib/$(DEB_HOST_MULTIARCH) DEFINES+="VERSION=$(DEB_VERSION_UPSTREAM)" QT_DIR=$(QT_DIR) diff --git a/main.cpp b/main.cpp index 304aa28..018dff1 100755 --- a/main.cpp +++ b/main.cpp @@ -20,7 +20,11 @@ #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #include +#else +#include +#endif DCORE_USE_NAMESPACE @@ -29,7 +33,7 @@ DCORE_USE_NAMESPACE int main(int argc, char *argv[]) { qDebug() << "Main: Starting dde-device-formatter application"; - + // 设置Deepin平台主题 if (qgetenv("QT_QPA_PLATFORMTHEME").isEmpty()) { qputenv("QT_QPA_PLATFORMTHEME", "deepin"); @@ -131,7 +135,7 @@ int main(int argc, char *argv[]) } int code = a.exec(); - + qDebug() << "Main: Performing quick exit"; quick_exit(code); }