HarmonyOS鸿蒙PC开源QT软件移植:移植开源文本编辑器 NotePad--(Ndd)到鸿蒙 PC实践总结
本文结合当前仓库notepad--_ohos说明如何把基于 Qt Widgets 的开源项目NotePad–常称 Ndd从传统桌面形态迁移为可在鸿蒙 PC / 平板上安装的 HAP 应用。核心结论先在 Windows 上交叉编译出面向 OpenHarmony 的libNotePad--.so再在 DevEco Studio 的 ArkTS 工程里加载该库并完成打包与签名。移植成功后的运行效果移植后的开源地址https://gitcode.com/qq8864/notepad–_ohos一、为什么鸿蒙上的 Qt 和传统 PC 不一样维度传统 Qt PC 应用鸿蒙上的 Qt 应用本方案产物形态多为独立可执行文件如 Windows 下.exe业务 UI 与逻辑编译为.so动态库工程入口Qt Creator / CMake 直接生成可执行目标CMake 仍负责原生库Ability / Stage / 生命周期由 DevEco Studio 的 ArkTS 模板承载运行方式操作系统直接启动进程系统启动 ArkTS 应用进程再由Qt on OHOS如libqohos.so在运行时加载你的libNotePad--.so因此移植的“分水岭”不是把 ArkTS 重写一遍而是把原先add_executable的主程序在 OHOS 交叉编译条件下改为add_library(… SHARED …)产出与 ArkTS 侧约定的库名一致的原生库其余壳层使用官方或模板提供的 Qt 嵌入式工程即可。二、待移植的Notepad-- 介绍Notepad-- 是使用C编写的轻量级文本编辑器简称ndd目前在git仓库上有15.5K Stars。可以支持Window/Mac/Linux操作系统平台。是替换notepad的一种选择其内置强大的代码对比功能让你丢掉付费的beyond compare。目标是完成文本编辑类软件的国产可替代重点在国产Uos/Linux系统、Mac 系统上发展。对比其它竞品Notepad类软件而言优势是可以跨平台支持linux mac操作系统。NotePad–开源地址https://gitee.com/cxasm/notepad–三、本仓库中的代码布局鸿蒙工程根目录notepad--_ohos/DevEco Studio 打开的工程。Qt 侧源码NotePad-- 主工程Doc/src_qt_prj/notepad---main/说明若你本地或文档中写作notepad--_main请以Doc/src_qt_prj/下实际文件夹名为准本仓库为notepad---main。ArkTS 中声明要加载的库名entry/src/main/ets/common/QtAppConstants.ets//entry/src/main/ets/common/QtAppConstants.etsexportconstAPP_LIBRARY_NAMElibNotePad--.so;exportconstLOG_DOMAIN0x0000;exportconstLOG_TAGohosNotePad--;Qt 运行时初始化入口模板侧entry/src/main/ets/qabilitystage/QAbilityStage.ets中通过qpa.setupQtApplication({ … appName: APP_LIBRARY_NAME … })把APP_LIBRARY_NAME传给原生层用于加载对应.so。四、移植总流程参考文章《HarmonyOS 鸿蒙PC端 Qt 应用开发第三方 Qt 开源软件移植指南》准备环境DevEco Studio / HarmonyOS SDK含 OpenHarmonynative工具链与ohos.toolchain.cmake。面向鸿蒙的 Qt 5.12构建树示例路径下文以C:/Qt/qt-5.12.12-ohos表示需与目标 ABI如arm64-v8a一致。下载地址https://gitcode.com/OpenHarmonyPCDeveloper/ohos_Qt5.12.12修改 Qt 工程 CMake在OHOS条件下将主目标从可执行文件改为共享库本仓库已改好可作参考。使用 CMake OHOS 工具链配置并编译在单独的 build 目录中执行cmake配置与cmake --build得到libNotePad--.so。集成到 DevEco 工程将libNotePad--.so及 Qt 运行依赖如各libQt5*.so、平台插件等按 Qt-for-OHOS 文档放置放到 entry 模块约定位置保证与abiFilters如arm64-v8a/x86_64一致。确认 ArkTS 常量APP_LIBRARY_NAME与 CMakePROJECT_NAME/ 生成的lib前缀、--等特殊字符命名一致本工程为libNotePad--.so。Build HAP → 签名 → 安装到鸿蒙 PC 真机使用 DevEco Studio 正常打包流程即可。五、CMake 侧关键改动生成.so而非.exe本仓库在Doc/src_qt_prj/notepad---main/CMakeLists.txt中用OHOS宏区分鸿蒙交叉编译鸿蒙下使用add_library(… SHARED …)其它平台保持原有add_executable逻辑。#Doc/src_qt_prj/notepad---main/CMakeLists.txtif(OHOS)# 鸿蒙交叉编译环境下message(STATUS 当前模式: 鸿蒙交叉编译 (生成 SHARED 库) )add_library(${PROJECT_NAME}SHARED${SRC}${UI_SRC}${PROJECT_SOURCE_DIR}/src/RealCompare.qrc)elseif(CMAKE_HOST_WIN32)# 原有的 Windows 可执行文件逻辑list(APPEND WIN_RCS${PROJECT_SOURCE_DIR}/src/RealCompareToMinGw.rc)add_executable(${PROJECT_NAME}WIN32${WIN_RCS}${SRC}${UI_SRC}${PROJECT_SOURCE_DIR}/src/RealCompare.qrc)else()message(STATUS 当前模式: 其他平台编译 )add_executable(${PROJECT_NAME}${SRC}${UI_SRC}${PROJECT_SOURCE_DIR}/src/RealCompare.qrc)endif()要点project(NotePad-- …)与add_library(${PROJECT_NAME} SHARED …)共同决定生成的库文件名一般为libNotePad--.so与QtAppConstants.ets中字符串一致。仍通过find_package(Qt5 …)与target_link_libraries链接 Qt 与qscint等子工程鸿蒙下只要Qt 与工具链均为 OHOS 目标即可链接通过。六、编译libNotePad--.so命令以下路径需按你本机SDK 安装位置、Qt OHOS 根目录修改。示例与仓库内Doc/src_qt_prj/notepad---main/build/build_ohos.bat思路一致指定OHOS 的cmake.exe、ohos.toolchain.cmake、-DOHOS_ARCH以及Qt5 的CMAKE_PREFIX_PATH/Qt5_DIR。在notepad---main下新建或进入build目录后执行1配置GenerateD:\oh\DevEcoStudio\sdk\HarmonyOS-NEXT-DB6\openharmony\native\build-tools\cmake\bin\cmake.exe^-DCMAKE_PREFIX_PATHC:/Qt/qt-5.12.12-ohos^-DCMAKE_TOOLCHAIN_FILED:/oh/DevEcoStudio/sdk/HarmonyOS-NEXT-DB6/openharmony/native/build/cmake/ohos.toolchain.cmake^-DQt5_DIRC:/Qt/qt-5.12.12-ohos/lib/cmake/Qt5^-DCMAKE_FIND_ROOT_PATHC:/Qt/qt-5.12.12-ohos^-DOHOS_ARCHarm64-v8a ^..2构建D:\oh\DevEcoStudio\sdk\HarmonyOS-NEXT-DB6\openharmony\native\build-tools\cmake\bin\cmake.exe--build.成功后在 build 目录或 CMake 配置的输出目录下可找到libNotePad--.so。可选本仓库已提供批处理Doc/src_qt_prj/notepad---main/build/build_ohos.bat其中包含SDK_PATH、QT_ROOT、ARCH等变量可按机器路径改完后双击或在命令行执行完成“配置 Ninja 构建”两步。或者嫌上述命令的方式太长可以整理为一个通用的脚本。脚本如下echo off setlocal :::: 作者猫哥 :: 邮箱[534117529qq.com]:: 博客[blog.csdn.net/qq8864]:: 描述QT的Cmake工程的鸿蒙PC平台编译脚本 :::::: 配置项自定义区 :::: SDK 与 工具链路径setSDK_PATHD:\oh\DevEcoStudio\sdk\HarmonyOS-NEXT-DB6\openharmony\nativesetCMAKE_EXE%SDK_PATH%\build-tools\cmake\bin\cmake.exesetTOOLCHAIN%SDK_PATH%\build\cmake\ohos.toolchain.cmake :: Qt 相关路径setQT_ROOTC:/Qt/qt-5.12.12-ohossetQT_DIR%QT_ROOT%/lib/cmake/Qt5 :: 编译配置setARCHarm64-v8asetBUILD_TYPEDebugsetSOURCE_DIR../ :::: 第一步配置项目(CMake Configure)::echo[信息]正在启动面向 OpenHarmony 的 CMake 配置...echo[信息]目标架构: %ARCH%%CMAKE_EXE%^-GNinja^-DCMAKE_BUILD_TYPE%BUILD_TYPE% ^-DOHOS_ARCH%ARCH% ^-DCMAKE_TOOLCHAIN_FILE%TOOLCHAIN%^-DCMAKE_PREFIX_PATH%QT_ROOT%^-DQt5_DIR%QT_DIR%^-DCMAKE_FIND_ROOT_PATH%QT_ROOT%^ %SOURCE_DIR%if%ERRORLEVEL% NEQ0(echo[错误]CMake 配置阶段失败!pauseexit/b %ERRORLEVEL%):::: 第二步执行构建(CMake Build)::echo[信息]配置成功正在开始构建项目... :: 使用--build参数跨平台调用 Ninja 编译%CMAKE_EXE%--build.if%ERRORLEVEL% NEQ0(echo[错误]编译构建阶段失败!pauseexit/b %ERRORLEVEL%)echo[成功]恭喜编译顺利完成 pause构建成截图七、与 DevEco 工程对接时要注意什么库名与 ArkTS 常量一致修改或核对export const APP_LIBRARY_NAME libNotePad--.so;必须与磁盘上的主业务库文件名一致含lib前缀与.so后缀。ABI 一致entry/build-profile.json5中的abiFilters需包含你编译.so时使用的架构如真机多为arm64-v8a模拟器可能为x86_64。若只编了arm64-v8a却打开了x86_64过滤需在对应 ABI 目录补齐同名的.so或调整过滤项。Qt on OHOS 运行时依赖QAbilityStage.ets会import qpa from libqohos.so再通过setupQtApplication加载你的业务库。除libNotePad--.so外通常还需按 Qt-for-OHOS 要求部署平台插件、Qt 核心库等若缺失日志中会提示与qpa / nettool.so等相关的加载问题需对照官方说明补齐entry下各 ABI 的libs布局。HAP 打包与签名原生库随 entry 模块打入 HAP使用 DevEco Studio 的自动签名或你的发布证书完成签名后安装到鸿蒙 PC 真机验证。八、小结传统 Qt PCCMake/Qt Creator →可执行文件。鸿蒙 Qt 应用本方案同一套 Qt 业务代码 → CMake 在OHOS 工具链 Qt-for-OHOS下 →libNotePad--.so→ DevEcoArkTS 壳加载 →HAP上真机运行。当前仓库已把CMake 的 OHOS 分支与ArkTS 的APP_LIBRARY_NAME对齐你只需按机器路径完成SDK/Qt 配置、编译出.so并放入工程约定位置即可在鸿蒙 PC 上完成端到端验证与后续迭代。参考链接HUAWEI DevEco StudioQt for OpenHarmony示例源码托管https://wiki.qt.io/Qt_for_OpenHarmony/zh最后欢迎加入开源鸿蒙开发者社区交流https://harmonypc.csdn.net/