当前位置: 首页 > news >正文

鸿蒙PC:Qt适配OpenHarmony实战【取色间】:RGB 滑动调整、HEX 展示和颜色预览

前言

欢迎加入鸿蒙PC开发者社区,共同打造开发者工具生态:鸿蒙PC开发者社区 :https://harmonypc.csdn.net/

项目开源地址:https://atomgit.com/lqjmac/qtqsj

如果你正在把 Qt Quick 放到鸿蒙窗口里跑,最容易踩坑的往往不是控件,而是构建参数、入口符号和窗口刷新。
本文记录第 16 个 Qt 适配鸿蒙小项目:取色间
它的定位是调色板,核心功能是调整 RGB 颜色并显示预览
调色板是一个很直观的 Qt Quick 示例:数据一动,颜色预览马上变化。
取色间 的工程价值不是功能复杂,而是把 Qt Quick、OpenHarmony HAP、QML 资源和窗口刷新串成一条可复现路径。

提示:本文按真实工程路径和真实 Bundle Name 编写,命令可以直接对照项目目录执行。

推荐阅读顺序:

  1. 确认项目目录、中文展示名和 Bundle Name。
  2. 检查 Qt SDK 相对路径,避免构建机路径绑定。
  3. 运行构建、安装、启动和日志过滤命令。

本文包含的重点元素:

  • 项目截图
  • 配置表格
  • 构建命令
  • QML 片段
  • 常见问题表

一、应用目标

1.1 项目解决什么问题

取色间不是为了把 调色板 做到复杂,而是为了验证 Qt Quick 在鸿蒙桌面窗口里的完整链路。
这个链路包含资源配置、Native CMake、QML 首屏、双入口导出、窗口自适应、HAP 构建和设备启动。

主要功能如下:

  • 调整 R G B 三个通道
  • 实时显示颜色预览
  • 展示 HEX 和 RGB 数值
  • 常用色板一键取色
  • 明暗对比文字预览

1.2 最终运行截图

图 1:取色间 在 OpenHarmony 桌面环境里的运行效果。

1.3 关注点速览

关注点为什么重要在本项目中的体现
应用标识避免 25 个 Demo 安装冲突com.nutpi.qusejian
QML 状态决定界面是否能即时反馈三个通道值共同组成颜色字符串,再用于预览块和 HEX 文本
构建参数决定换机器后能否继续构建-DQT_PREFIX=../qtforharmony
启动入口避免白屏和符号缺失同时保留mainqtmain

二、目录和包名

2.1 信息总览

项目内容
应用展示名取色间
项目目录名QtColorPickerDemo
Bundle Namecom.nutpi.qusejian
CMake projectqusejian_colorpicker
项目类型调色板
核心功能调整 RGB 颜色并显示预览

这张表建议和 README 中的信息保持一致。项目多了以后,最怕的是展示名、包名和目录名互相错位。

2.2 目录结构

qt_for_harmony/ ├── qtforharmony/ ├── QtColorPickerDemo/ │ ├── AppScope/ │ ├── entry/ │ │ ├── build-profile.json5 │ │ └── src/main/cpp/ │ │ ├── CMakeLists.txt │ │ ├── main.cpp │ │ ├── main.qml │ │ └── qml.qrc │ └── README.md └── qt-docs/

这里有一个朴素但重要的规则:Qt SDK 放在项目同级目录,不塞进每个 Demo 里面。

2.3 模块职责

模块作用检查点
AppScope应用包名和展示名com.nutpi.qusejian是否唯一
entry/build-profile.json5native 构建参数Qt SDK 相对路径
entry/src/main/cppC++ 入口和 QMLmain.qml是否进入 qrc
README.md项目说明构建和启动命令是否完整

三、Qt SDK 相对路径

3.1 build-profile.json5

项目需要使用相对路径指定 Qt SDK。当前工程使用的关键片段如下:

{ "externalNativeOptions": { "path": "./src/main/cpp/CMakeLists.txt", "arguments": "-DQT_PREFIX=../qtforharmony", "cppFlags": "", "abiFilters": ["arm64-v8a"] } }

关键规则:项目需要"arguments": "-DQT_PREFIX=../qtforharmony",SDK 文件请到文末保留的 SDK 仓库自取,并放到项目同级目录qtforharmony中。

3.2 CMakeLists.txt

cmake_minimum_required(VERSION 3.5.0) project(qusejian_colorpicker) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) get_filename_component(PROJECT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../../../.." ABSOLUTE) if (NOT IS_ABSOLUTE "${QT_PREFIX}") get_filename_component(QT_PREFIX "${PROJECT_ROOT}/${QT_PREFIX}" ABSOLUTE) endif() list(PREPEND CMAKE_PREFIX_PATH ${QT_PREFIX}) find_package(Qt5 REQUIRED COMPONENTS Core Gui Qml Quick QuickControls2) add_library(entry SHARED main.cpp qml.qrc)

这段配置先把相对的QT_PREFIX转成绝对路径,再交给 CMake 查找 Qt。

3.3 qml.qrc

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

把 QML 打进 Qt 资源系统后,运行时可以统一通过qrc:/main.qml加载。

四、QML 首屏组织

4.1 首屏布局

预览区占上方,RGB 控制放中间,常用色板和文本对比放在下方。
这种布局不是为了炫技,而是为了让 Demo 的功能一眼就能被看懂。

4.2 根节点尺寸策略

Rectangle { id: root width: 960 height: 1080 color: "#F5F6FA" property real margin: Math.max(20, Math.min(48, width * 0.042)) property real gap: Math.max(12, Math.min(24, width * 0.022)) property real titleSize: Math.max(34, Math.min(58, width * 0.054)) }

根节点给出默认尺寸,真正运行时由QQuickView::SizeRootObjectToView接管。

4.3 本项目的数据模型

ListModel { id: demoModel ListElement { name: "示例项一"; state: "ready" } ListElement { name: "示例项二"; state: "active" } ListElement { name: "示例项三"; state: "done" } }

实际工程中,取色间 使用的是paletteModel。这些数据都在 QML 内部,适合单机演示。

五、交互逻辑拆解

5.1 函数职责表

函数职责
hexText()封装业务逻辑
rgbText()封装业务逻辑
setPreset(row)恢复或清理状态
contrastColor()封装业务逻辑

这些函数没有故意抽得很复杂。Demo 项目最重要的是让读者能从 QML 文件里直接看懂状态从哪里来、又流向哪里。

5.2 典型交互片段

MouseArea { anchors.fill: parent onClicked: { // 点击后修改模型状态,界面绑定会自动刷新 demoModel.setProperty(index, "state", "done") } }

点击事件只负责改变状态,展示层通过绑定更新,这比手动到处刷新文本更稳。

5.3 业务函数示意

function demoFlow(row) { var current = row var before = demoModel.count demoModel.setProperty(row, "state", "done") return before }

这段不是要照搬,而是说明当前项目的函数组织方式:

  • 先从模型拿当前数据
  • 再执行用户动作
  • 最后让绑定表达式刷新界面

六、C++ 入口保持稳定

6.1 保留双入口

extern"C"voidqtmain(){staticResponsiveQuickView*view=nullptr;if(view!=nullptr){return;}configureSurfaceFormat();view=newResponsiveQuickView();loadQml(view);}intmain(intargc,char*argv[]){configureSurfaceFormat();QGuiApplicationapp(argc,argv);ResponsiveQuickView view;if(!loadQml(&view)){return-1;}returnapp.exec();}

之前遇到过只导出qtmain时运行时报Symbol not found: main的情况,所以这一批 Qt Demo 都统一保留两个入口。

6.2 标题和 QML 加载

boolloadQml(ResponsiveQuickView*view){view->setTitle(QStringLiteral("取色间"));view->setSource(QUrl(QStringLiteral("qrc:/main.qml")));if(view->status()==QQuickView::Error){qWarning()<<"Failed to load qrc:/main.qml";returnfalse;}view->showResponsive();returntrue;}

这里标题要和应用展示名保持一致。运行时如果日志出现 QML 加载失败,优先检查qml.qrc

七、命令行跑通

7.1 构建 HAP

cdQtColorPickerDemo /Users/luqingjiedemac/ohos/command-line-tools/bin/hvigorw assembleHap--stacktrace

构建完成后,HAP 默认输出在下面这个路径:

entry/build/default/outputs/default/entry-default-unsigned.hap

7.2 安装和启动

hdcinstall-rentry/build/default/outputs/default/entry-default-unsigned.hap hdc shell aa start-aEntryAbility-bcom.nutpi.qusejian-mentry

启动命令里的 Bundle Name 必须和AppScope/app.json5一致。

7.3 构建失败先看哪里

  1. QT_PREFIX是否指向同级qtforharmony
  2. CMakeLists.txt的 project 名称是否已经替换。
  3. main.qml是否存在于qml.qrc中。

八、窗口缩放验证

8.1 过滤关键日志

hdc shell hilog-x-z500|rg-n"QtForOpenHarmony|QPAForOpenHarmony|qusejian|Failed|failed|Error|error|qrc|main function|Symbol not found|QML|ReferenceError|TypeError"

我重点看这些信号:

  • 是否出现Symbol not found: main
  • 是否出现Failed to load qrc:/main.qml
  • 是否出现 QML 的ReferenceErrorTypeError
  • 是否能看到应用进程还在运行

8.2 截图命令

hdc shell snapshot_display-f/data/local/tmp/qusejian_screen.jpeg hdcfilerecv /data/local/tmp/qusejian_screen.jpeg ./qt-docs/assets/qusejian-screen.jpeg

截图不是装饰,它是确认首屏真的渲染出来的证据。

8.3 当前项目验证点

  1. 滑动通道后预览变化
  2. HEX 文本格式稳定
  3. 预设颜色能回填 RGB

经验:这类小项目最适合把功能做窄,把构建、启动、截图、日志验证做完整。

九、问题表

9.1 常见问题表

现象可能原因处理方式
白屏QML 没加载成功或窗口未刷新检查qrc:/main.qml和日志
找不到 main只保留了qtmain同时导出mainqtmain
构建找不到 QtQT_PREFIX路径错误使用-DQT_PREFIX=../qtforharmony
启动失败Bundle Name 写错对照com.nutpi.qusejian
窗口缩放不刷新根对象没有跟随窗口尺寸使用响应式QQuickView刷新策略

9.2 排查顺序

  1. 先看 HAP 是否重新构建。
  2. 再看安装的包名是不是当前项目。
  3. 然后看日志里有没有 QML 或 main 符号错误。
  4. 最后才去调整具体控件布局。

十、下一步迭代

10.1 可以继续做的功能

  • 增加 HSL 模式
  • 复制 HEX
  • 保存最近颜色

这些扩展不建议一口气全做。Qt 适配鸿蒙的早期样例,优先目标应该是结构稳定、运行稳定、验证路径稳定。

10.2 工程增强方向

QtObject { id: appState property int currentIndex: 0 property bool dirty: false property string message: "ready" }

当页面状态继续变多,可以把零散属性收进一个QtObject,这样顶层不会越来越乱。

10.3 清理和重建

rm-rfentry/build entry/.cxx .hvigor /Users/luqingjiedemac/ohos/command-line-tools/bin/hvigorw assembleHap--stacktrace

遇到缓存比较顽固的问题时,可以清掉构建产物后重建。正常开发时不需要每次都清理。

十一、相关入口

11.1 OpenHarmony 文档入口

OpenHarmony 文档中心:https://docs.openharmony.cn/

11.2 Qt for Harmony SDK 仓库

Qt for Harmony SDK 仓库:https://atomgit.com/nutpi/qtforharmony_sdk

11.3 为什么只保留三个链接

这批文章用于项目发布和读者复现。链接过多会分散注意力,所以正文只保留社区入口、OpenHarmony 文档和 Qt SDK 仓库三个入口。

总结

取色间 这个 Demo 的重点是调整 RGB 颜色并显示预览
从工程角度看,它已经覆盖了 Qt for OpenHarmony 项目里最关键的几步:配置 Qt SDK、打包 QML、保留双入口、构建 HAP、安装启动和截图验证。
如果你也在做 Qt 适配鸿蒙,可以先用这种小项目把链路跑稳,再逐步接入更真实的数据和业务。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!

http://www.jsqmd.com/news/886570/

相关文章:

  • 神经网络与深度学习 第3周课程总结
  • 嵌入式Day18--数据结构
  • DocumentsWriterDeleteQueue
  • 翻译 GDB 官方文档
  • 2026年化妆品贴牌定制加工厂推荐榜:网红爆品、国潮风、私域品牌定制,低成本创业之选! - 资讯快报
  • Python UiAutomation实战:从网页数据抓取到桌面应用,一个库打通数据采集全链路
  • 【SRC漏洞挖掘系列】第09期:XXE与反序列化 —— 当XML和Java开始“吃”代码
  • 一个取巧但有效的方法:利用PAT报错信息反向“猜”出测试数据(附Python二分脚本)
  • 2026长沙智能家居品牌实测,这些本地老牌值得选
  • 航空螺栓螺母表面油污清洁度检测仪为何至关重要-西恩士 - 工业干货社
  • 电信运营商每月处理海量工单,如何不再出错?基于AI Agent的端到端自动化解决方案
  • # 2026年陕西热门高考补习学校盘点:哪家提分效果好?(附选型指南) - 科技焦点
  • 小学期十二周
  • 2026会计人员能力及学习提升方向指导
  • GEO生成引擎优化:当AI成为信息分发的主角,品牌如何抢占对话窗口?
  • 从游戏引擎到仿真平台:手把手教你用AirSim+UE4搭建你的第一个无人机/自动驾驶仿真环境
  • 四川小自考畜牧兽医专业代码是什么?有哪些学校可以选择?推荐这家靠谱助学点报名! - 知名不具123
  • # 2026年西安性价比高的高三补习班推荐:基于价格与师资、效果测评 - 科技焦点
  • 特斯拉与SpaceX软件开发体系
  • 欧姆龙PLC通过以太网模块实现Web远程诊断,故障排查时间缩短70%
  • 05华夏之光永存:150吨级火星EDL进入下降着陆全链条解决方案
  • 2026年ChatBI产品TOP5深度测评:行业落地能力与问数准确率全维度对比 - 科技焦点
  • Windows 11终极优化秘籍:如何使用Win11Debloat彻底清理系统垃圾和隐私追踪
  • Godot4 2D游戏开发避坑指南:TileMap绘制、节点顺序与相机设置的三个常见问题
  • CANoe诊断测试没CDD文件怎么办?手把手教你用Fault Memory窗口和CAPL脚本读取解析DTC故障码
  • ssm207基于SSM的视频播放系统的设计与实现+vue(文档+源码)_kaic
  • # 西安高考冲刺班学校推荐:2026年TOP5机构选型指南 - 科技焦点
  • Allure报告不只是好看:用@allure.feature和step让你的Python自动化测试用例更规范、更好维护
  • 电力行业设备台账与巡检报告,何时能告别手工?基于实在Agent的端到端方案
  • 2026年了,GEO生成引擎优化到底在优化什么?一文讲透底层逻辑与实战框架