HarmonyOS 鸿蒙Next PC实现拖拽文件并添加到tableView列表示例

HarmonyOS 鸿蒙Next PC实现拖拽文件并添加到tableView列表示例

场景介绍

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

效果预览

cke_417.png

实现思路

编写自定义的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 PC实现拖拽文件并添加到tableView列表示例


更多关于HarmonyOS 鸿蒙Next PC实现拖拽文件并添加到tableView列表示例的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

学习了

更多关于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并重写拖拽事件处理函数。

实现的核心步骤:

  1. 自定义FileTableView类继承QTableView,在构造函数中调用setAcceptDrops(true)启用拖拽接收。
  2. 重写dragEnterEventdropEvent方法处理拖拽逻辑。
  3. dropEvent中通过event->mimeData()->urls()获取拖拽的文件URL列表。
  4. 遍历URL列表,使用QFileInfo提取文件名和路径信息。
  5. 创建QStandardItem对象并添加到QStandardItemModel中完成数据更新。

需要注意的细节:

  • 当前版本存在event->mimeData()->hasUrls()无法正确识别URL数据的问题,建议在dragEnterEvent中直接调用acceptProposedAction()作为临时解决方案。
  • 需要正确配置Qt环境,特别是QT_PREFIX路径和平台插件libplugins_platforms_qopenharmony.so的替换。

这个示例为HarmonyOS PC端Qt应用的文件操作提供了很好的参考实现,代码结构清晰,易于理解和扩展。

回到顶部