在 Mac 上用 DevEco + Qt for OpenHarmony 开发你的第一个 QML 应用

欢迎加入开源鸿蒙 PC 社区:https://harmonypc.csdn.net/

一句话:不敲命令行交叉编译,在 DevEco Studio 里用 Native C++ 模板 + 社区 Qt SDK,直接写一个在鸿蒙设备上跑的 Qt Quick 应用。
前提:Mac 已装 DevEco Studio + OHOS SDK,有 Qt/C++ 基础。


在这里插入图片描述

一、版本号要对齐

开始之前确认三件事:

软件 要求
DevEco Studio ≥ 5.0.5
OHOS API ≥ 12
Qt SDK 5.15.12 alpha 社区预编译版

Apple Silicon Mac 先装 Rosetta:

softwareupdate --install-rosetta --agree-to-license

在这里插入图片描述
在这里插入图片描述

二、下载 Qt for OpenHarmony 社区 SDK

不需要自己编译 Qt。社区有预编译包。

下载地址https://atomgit.com/openharmony-sig/qt/releases

找到最新 alpha 标签,下 Mac 版,文件名类似 Qt5.15.12_alpha_v7_arm64-v8a_openharmony_ndk_5.0.3.135_community_macos.tar.gz

mkdir -p ~/QtForOpenHarmony
tar -xzf Qt5.15.12_alpha_v7_*.tar.gz -C ~/QtForOpenHarmony

# 验证
cd ~/QtForOpenHarmony/bin
./qmake -query
# 看到 QMAKE_XSPEC:oh-clang 即成功

支持的 Qt 模块:Core / Gui / Widgets / Network / Qml / Quick / QuickControls2 / QuickWidgets / Sql / Svg / Concurrent / PrintSupport / Multimedia。不支持 QtWebEngine。


在这里插入图片描述

三、新建工程 + 改造为 Qt Quick

步骤 1:新建 Native C++ 工程

DevEco → New Project → Native C++ → Next
  • Project name:QtForHOHello
  • Compile SDK:API 12+
  • Device type:勾 2in1(鸿蒙 PC 必勾)
  • 路径纯英文

步骤 2:删掉模板自带的 napi_init.cpp

右键 entry/src/main/cpp/napi_init.cpp → Delete

步骤 3:拷贝 Qt SDK 文件到工程

QT_SDK=~/QtForOpenHarmony

# Qt 头文件 + 库
cp -r $QT_SDK/openharmony/qtbase/* entry/src/main/ets/

# QML 运行库
cp -r $QT_SDK/qml entry/libs/arm64-v8a/
mkdir -p entry/src/main/resources/resfile
cp -r $QT_SDK/qml entry/src/main/resources/resfile/

# 平台插件
cp $QT_SDK/plugins/platforms/libplugins_platforms_qopenharmony.so \
   entry/libs/arm64-v8a/

步骤 4:替换 CMakeLists.txt

entry/CMakeLists.txt 全替换为:

cmake_minimum_required(VERSION 3.5.0)
project(QtForHOHello)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

list(APPEND CMAKE_FIND_ROOT_PATH ${QT_PREFIX})

find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS
    Concurrent Gui Network Qml Quick QuickControls2
    Widgets QuickTemplates2 QmlWorkerScript
    OpenHarmonyPlatformIntegrationPlugin)

add_library(entry SHARED main.cpp qml.qrc)

target_link_libraries(entry PRIVATE
    Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui
    Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::Qml
    Qt${QT_VERSION_MAJOR}::QuickControls2 Qt${QT_VERSION_MAJOR}::Widgets
    Qt${QT_VERSION_MAJOR}::Concurrent Qt${QT_VERSION_MAJOR}::Network
    Qt${QT_VERSION_MAJOR}::OpenHarmonyPlatformIntegrationPlugin)

步骤 5:写 3 个 Qt 文件

entry/src/main/cpp/ 下新建:

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty()) return -1;
    return app.exec();
}

main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15

Window {
    width: 640; height: 480; visible: true
    title: "Qt Quick on HarmonyOS"

    Rectangle {
        width: 400; height: 240; color: "#e0f0ff"; radius: 12
        anchors.centerIn: parent

        Column {
            anchors.centerIn: parent; spacing: 16
            Text {
                text: "Hello from Qt Quick!"
                font.pixelSize: 28; font.bold: true
                color: "#1a1a2e"
                anchors.horizontalCenter: parent.horizontalCenter
            }
            Text {
                text: "Running on HarmonyOS via DevEco"
                font.pixelSize: 14; color: "#555"
                anchors.horizontalCenter: parent.horizontalCenter
            }
            Button {
                text: "Click Me"
                anchors.horizontalCenter: parent.horizontalCenter
                onClicked: console.log("Clicked!")
            }
        }
    }
}

qml.qrc

<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
    </qresource>
</RCC>

步骤 6:配 build-profile.json5

entry/build-profile.json5,找到 externalNativeOptions,改成:

"arguments": "-DQT_PREFIX=/Users/<你的用户名>/QtForOpenHarmony",
"abiFilters": ["arm64-v8a"]

注意QT_PREFIX 绝对路径必须对。

步骤 7:module.json5 支持多窗口

entry/src/main/module.json5,把 abilities[0].launchType 改成 "specified"——否则多窗口 Qt 应用会受限。


四、编译 + 运行

DevEco → File → Sync Project(等一下 ohpm 装依赖)
DevEco → Build → Build App(⌘+F9) 或直接 ▶ Run(⌃+R)

连上鸿蒙设备,点 Run。预期结果:设备屏幕出现一个蓝色圆角矩形,中间写着 “Hello from Qt Quick!” + 一个可点击按钮。


五、6 个常见坑

#1 QT_PREFIX 路径不对

  • 现象:cmake 配置报 Could NOT find Qt5
  • 解决:entry/build-profile.json5QT_PREFIX 必须是绝对路径且指向 ~/QtForOpenHarmony(不是 ~/QtForOpenHarmony/bin

#2 忘了删 napi_init.cpp

  • 现象:编译报 multiple definition of main
  • 解决:删除 entry/src/main/cpp/napi_init.cpp

#3 没有拷贝 QML 到 resfile

  • 现象:应用启动白屏,hilog 报 qrc:/main.qml not found
  • 解决:mkdir -p entry/src/main/resources/resfile && cp -r $QT_SDK/qml entry/src/main/resources/resfile/

#4 launchType 没改成 specified

  • 现象:第二个 Qt 窗口打不开
  • 解决:module.json5launchType: "specified"

#5 Qt SDK 版本和 OHOS API 不匹配

  • 现象:链接时 undefined symbol 一大片
  • 解决:Qt SDK 文件名里有 ndk_5.0.3.135 字样——这个 NDK 版本必须和 DevEco 装的 OHOS API 的 Native SDK 版本一致

#6 arm64-v8a 滤镜没设

  • 现象:编译产物是 x86_64 不是 aarch64
  • 解决:build-profile.json5abiFilters["arm64-v8a"]

六、5 个关键 Qt API 提示

场景 用哪个
窗口应用 QGuiApplication + QQmlApplicationEngine
Widget 应用 QApplication + QWidget 子类
多窗口 launchType: specified + 多个 Window 对象
系统能力查询 Qt 提供了 QSysInfo::productType() 等 API,但不能替代 ArkTS 的 canIUse()
资源加载 QML 里的图片/SVG 走 qrc:/ 前缀

七、如果遇到"编译通过但真机黑屏"

按顺序排查:

  1. hdc shell hilog | grep QtForHO——看有没有明显错误
  2. 确认 entry/libs/arm64-v8a/ 下有 libplugins_platforms_qopenharmony.so
  3. 确认 entry/src/main/resources/resfile/qml/ 下有 QML 运行库
  4. 确认 module.json5 里有 2in1 在 deviceTypes 里

八、什么时候用这条路 vs 用已有的 Qt Widget 老项目

  • 新项目:首选本路径(DevEco + Qt Quick / QML)——从零开发快、声明式 UI 改起来方便
  • 老项目:如果已有 Qt Widget 应用,能做两件事:优先评估能不能用 QML 重写核心界面;如果不适合重写,再考虑交叉编译整包移植
  • 团队习惯 C++ 多于 QML:可以先跑通本篇的 Hello World 感受一下,再决定长期用哪种方式

九、配套资源

资源 链接
Qt for OpenHarmony Wiki wiki.qt.io/Qt_for_OpenHarmony/zh
社区预编译 Qt SDK 下载 atomgit.com/openharmony-sig/qt/releases
DevEco Studio 下载 developer.huawei.com/consumer/cn/deveco-studio/

写在最后

从下载 Qt SDK → 新建工程 → 写 main.qml → 点 Run 看到 “Hello from Qt Quick!”——整个流程不出意外约 2-3 小时。

关键认知就一个:

DevEco 不提供"Qt Quick 模板",但你可以用 Native C++ 模板改造出来。

改造的核心 = 3 个文件(main.cpp / main.qml / qml.qrc)+ 1 个配置(QT_PREFIX)+ 4 个拷贝(库 / QML / 插件到对应目录)。

跑通之后你就有了一条完全在 IDE 里图形化操作的 Qt 鸿蒙开发管线——不用命令行交叉编译,不用 ELF 体检,不用手动 ninja。写 QML 像写前端一样改一改就刷新看效果。

跑通后如果遇到编译或运行时问题,最常见的 6 个坑已经在第五节列了;更全面的错误排查可以用 hdc shell hilog 抓日志逐条定位。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐