QT实现拖拽打开文件

1 篇文章 0 订阅

0x01 QT中的拖拽支持

​ QT为我们提供了一整套的框架实现拖拽支持,可以为用户提供直观的跨应用或同应用内实现**“信息转移”。主要有将其拆分成了拖拽(Drag)放置(Drop)**这两部分。

拖拽本质上是将信息转为MIMEWidget间转移

由于本文主要实现的是拖拽文件进入程序打开文件,因此主要关注后面的部分,其关键的方法有:

  1. dragEnterEvent
  2. dropEvent

0x02 放置(Drop)支持

​ 为了使QWidget支持该特性,首先需要调用setAcceptDrops(true)来为该QWidget开启支持。同时还需要实现dragEnterEvent()dropEvent()两个**事件处理器(Event Handler)**来实现其业务功能。

dragEnterEvent

该方法主要是用于告知QT当前QWidget支持接收什么类型的数据,如下代码将告知QT的Drag&Drop系统当前QWidget只能处理纯文本内容:

void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasFormat("text/plain"))
        event->acceptProposedAction();
}

实际上,QMimeData已经有一些很方便的方法来对应这些类型:

TesterGetterSetterMIME Types
hasText()text()setText()text/plain
hasHtml()html()setHtml()text/html
hasUrls()urls()setUrls()text/uri-list

如果在该方法中,没有调用eventacceptProposedAction()方法,则拖拽进入窗口的内容为显示为禁止符号以提示用户该内容不支持,且不会继续进入dropEvent处理该事件。

dropEvent

该方法主要真正实现进入数据的解包,并按所需业务逻辑的需要进行处理,在这里主要对MIME进行真正的处理。

其携带的MIME信息与上一步的类同,就不再展开了。

0x03 实现拖拽打开文件

文件拖拽进入窗口后,实际上是以url的形式存在的,即传入的是文件路径。

因此我们的处理过程将分为3步:

  1. dragEnterEvent判断传入的Event是否包含Url
  2. dropEventurls分解,并过滤不合规的url
  3. 将剩余的urls传递给打开文件的部分

下面看下具体实现:

/* dragEnterEvent 过滤无用Event */
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasUrls())
        event->acceptProposedAction();
}

/* dropEvent 过滤无用urls,并将有效部分交给文件读取方式加载 */
void MainWindow::dropEvent(QDropEvent *event)
{
    QList<QUrl> urls = event->mimeData()->urls();
    QStringList files;
    QString suffixs = "bmp jpg jif jpeg png gif webp psd tif tiff mp4 avi mkv mpg wmv webm rm rmvb mov flv 3gp ts pdf";

    for( QUrl url : urls ){
        QFileInfo file(url.toLocalFile());	//toLocalFile可以获取文件路径,而非QUrl的file://开头的路径

        if( file.isFile() && suffixs.contains(file.suffix())) //过滤掉目录和不支持的后缀,如果要支持目录,则要自己遍历每一个目录。
            files.append(file.filePath());
    }

    if(!files.isEmpty())
        MediaFileModelItemManager::getInstance()->requestReadFilesAsync(files); //将文件交给文件打开逻辑进行后续的处理
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值