# DragFileTableView
**Repository Path**: scenario-samples/drag-file-table-view
## Basic Information
- **Project Name**: DragFileTableView
- **Description**: HarmonyOS PC实现拖拽文件并添加到tableView列表是HarmonyOS PC的Qt项目高频使用场景之一。
本示例在实现拖拽文件时启动使用setAcceptDrops(true);启动拖拽功能,通过遍历mimeData->urls()返回的数据来获取拖拽的文件信息。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-01-12
- **Last Updated**: 2026-02-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# HarmonyOS PC实现拖拽文件并添加到tableView列表示例
## 场景介绍
HarmonyOS PC实现拖拽文件并添加到tableView列表是HarmonyOS PC的Qt项目高频使用场景之一。
本示例在实现拖拽文件时启动使用`setAcceptDrops(true);`启动拖拽功能,通过遍历`mimeData->urls()`返回的数据来获取拖拽的文件信息。
## 效果预览
## 实现思路
编写自定义的`FileTableView`类继承[QTableView](https://doc.qt.io/archives/qt-5.15/qtableview.html)用于扩展拖拽功能,同时负责数据展示。QStandardItemModel负责存储文件名及文件路径数据,用于提供数据管理能力。main.cpp的部分代码如下:
- 设置允许接收拖拽:
```cpp
setAcceptDrops(true);
```
- 事件中调用[acceptProposedAction](https://doc.qt.io/archives/qt-5.15/qdropevent.html#acceptProposedAction)接受拖拽操作,代码如下:
```cpp
event->acceptProposedAction();
```
- 当文件被放下时触发dropEvent处理函数,通过获取文件信息并创建表格行,将文件名和路径添加到模型中,代码如下:
```cpp
void dropEvent(QDropEvent *event) override
{
auto *model = qobject_cast(this->model());
if (!model)
return;
const QList urls = event->mimeData()->urls();
for (const QUrl &url : urls) {
if (!url.isLocalFile())
continue;
QFileInfo info(url.toLocalFile());
QList 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产物目录:
```txt
# 检查环境变量是否存在
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 patt: ${QT_PREFIX}")
endif()
```
- 或者删除`entry\src\main\cpp\qtModule\CMakeLists.txt`中的`QT_PREFIX`定义,在`entry\build-profile.json5`中设置`QT_PREFIX`:
```json
"buildOption": {
"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt",
"arguments": "-DQT_PREFIX=D:\\arkTSProject\\QtSdkOpen\\ohos17_arm64-v8a_release",
"cppFlags": "",
"abiFilters": ["arm64-v8a"]
}
},
```
## 约束与限制
* 本示例支持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](https://gitcode.com/qtforohos/Build)
[QTableView](https://doc.qt.io/archives/qt-5.15/qtableview.html)
[acceptProposedAction](https://doc.qt.io/archives/qt-5.15/qdropevent.html#acceptProposedAction)