HarmonyOS 鸿蒙Next PC实现拖拽文件并添加到tableView列表示例
HarmonyOS 鸿蒙Next PC实现拖拽文件并添加到tableView列表示例
场景介绍
HarmonyOS PC实现拖拽文件并添加到tableView列表是HarmonyOS PC的Qt项目高频使用场景之一。
本示例在实现拖拽文件时使用setAcceptDrops(true);启动拖拽功能,通过遍历mimeData->urls()返回的数据来获取拖拽的文件信息。
效果预览

实现思路
编写自定义的FileTableView类继承QTableView用于扩展拖拽功能,同时负责数据展示。QStandardItemModel负责存储文件名及文件路径数据,用于提供数据管理能力。main.cpp的部分代码如下:
- 设置允许接收拖拽
setAcceptDrops(true); - 事件中调用acceptProposedAction接受拖拽操作,代码如下:
event->acceptProposedAction(); - 当文件被放下时触发dropEvent处理函数,通过获取文件信息并创建表格行,将文件名和路径添加到模型中,代码如下:
void dropEvent(QDropEvent *event) override { auto *model = qobject_cast<QStandardItemModel *>(this->model()); if (!model) return; const QList<QUrl> urls = event->mimeData()->urls(); for (const QUrl &url : urls) { if (!url.isLocalFile()) continue; QFileInfo info(url.toLocalFile()); QList<QStandardItem *> rowItems; rowItems << new QStandardItem(info.fileName()); rowItems << new QStandardItem(info.absoluteFilePath()); model->appendRow(rowItems); } event->acceptProposedAction(); }
说明
使用该示例需要将libs\arm64-v8a下的libplugins_platforms_qopenharmony.so文件替换为本地Qt安装路径\plugins\platforms目录下的libplugins_platforms_qopenharmony.so;将开源Qt安装路径配置到QT_PREFIX中,可以选择下面两个方案中的一个:
- 修改
entry\src\main\cpp\qtModule\CMakeLists.txt中的set(QT_PREFIX "D:\\arkTSProject\\QtSdkOpen\\ohos17_arm64-v8a_release")为编译出的Qt产物目录:# 检查环境变量是否存在 if(DEFINED ENV{WORKSPACE}) set(QT_PREFIX $ENV{WORKSPACE}/code/SDK/Qt/QtOpenSDK) message(STATUS "get QT_PREFIX PATH: ${QT_PREFIX}") else() set(QT_PREFIX "D:\\arkTSProject\\QtSdkOpen\\ohos17_arm64-v8a_release") message(STATUS "WORKSPACE not defined, using default path: ${QT_PREFIX}") endif() - 或者删除
entry\src\main\cpp\qtModule\CMakeLists.txt中的QT_PREFIX定义,在entry\build-profile.json5中设置QT_PREFIX:"buildOption": { "externalNativeOptions": { "path": "./src/main/cpp/CMakeLists.txt", "arguments": "-DQT_PREFIX=D:\\arkTSProject\\QtSdkOpen\\ohos17_arm64-v8a_release", "cppFlags": "", "abiFilters": ["arm64-v8a"] } },
【常见FAQ】
Q:将文件拖入窗口后,为什么没有显示文件名及路径?
A:目前通过event->mimeData()->hasUrls()暂时识别不到url数据,目前可以在dragEnterEvent中直接调用acceptProposedAction规避。
约束与限制
- 本示例支持API Version 20 Release及以上版本。
- 本示例支持HarmonyOS 6.0.0 Release SDK及以上版本。
- 本示例需要使用DevEco Studio 6.0.0 Release及以上版本进行编译运行。
工程目录
├─entry
│ ├─libs/arm64-v8a
│ │ └─libplugins_platforms_qopenharmony.so // Qt安装目录'plugins\platforms'HarmonyOS平台插件so
│ └─src
│ ├─main
│ │ ├─cpp
│ │ │ ├─CMakeLists.txt // Qt项目CMakeList文件
│ │ │ └─main.cpp // Qt主程序
│ │ ├─ets
│ │ │ ├─abilitystage
│ │ │ │ └─MyAbilityStage.ets
│ │ │ ├─entryability
│ │ │ │ └─EntryAbility.ets // 应用入口
│ │ │ └─pages
│ │ │ └─Index.ets // 主页面实现
│ │ ├─resources // 应用资源目录
│ │ └─module.json5 // 模块级核心配置文件
│ ├─build-profile.json5 // 工程结构/构建/定制化配置信息
│ └─oh-package.json5 // 描述全局配置
└─hvigor // 构建环境配置
参考文档
开源版Qt QTableView acceptProposedAction
代码示例
更多关于HarmonyOS 鸿蒙Next PC实现拖拽文件并添加到tableView列表示例的实战教程也可以访问 https://www.itying.com/category-93-b0.html
学习了
更多关于HarmonyOS 鸿蒙Next PC实现拖拽文件并添加到tableView列表示例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,通过ArkTS实现PC端拖拽文件到TableView,需使用@ohos.file.picker选择文件,结合@ohos.file.fs获取文件信息。通过onDrop事件监听拖拽,将文件路径与元数据添加到数据源,并绑定至Table组件的行数据。需在module.json5中声明ohos.permission.READ_MEDIA权限。示例代码展示拖拽事件处理与数据更新逻辑。
这是一个非常典型的HarmonyOS PC端Qt应用文件拖拽实现方案,核心逻辑清晰。关键点在于继承QTableView并重写拖拽事件处理函数。
实现的核心步骤:
- 自定义
FileTableView类继承QTableView,在构造函数中调用setAcceptDrops(true)启用拖拽接收。 - 重写
dragEnterEvent和dropEvent方法处理拖拽逻辑。 - 在
dropEvent中通过event->mimeData()->urls()获取拖拽的文件URL列表。 - 遍历URL列表,使用
QFileInfo提取文件名和路径信息。 - 创建
QStandardItem对象并添加到QStandardItemModel中完成数据更新。
需要注意的细节:
- 当前版本存在
event->mimeData()->hasUrls()无法正确识别URL数据的问题,建议在dragEnterEvent中直接调用acceptProposedAction()作为临时解决方案。 - 需要正确配置Qt环境,特别是
QT_PREFIX路径和平台插件libplugins_platforms_qopenharmony.so的替换。
这个示例为HarmonyOS PC端Qt应用的文件操作提供了很好的参考实现,代码结构清晰,易于理解和扩展。

