QMimeData

  QMimeDatabase 在 Qt 框架中主要用于处理文件的 MIME 类型(媒体类型或内容类型)。它在以下场景中非常有用:

1、文件类型识别: 当您需要确定给定文件的类型时,可以使用 QMimeDatabase 来获取文件的 MIME 类型。这在需要根据文件内容或扩展名来适当地处理文件时特别有用。例如,您可以根据 MIME 类型在应用程序中显示不同的图标,或者在文件打开对话框中提供适当的文件过滤器。

2、文件过滤和处理: 在涉及文件选择、文件保存或导入文件的功能中,您可以使用 QMimeDatabase 来提供适当的文件过滤器,以限制用户只能选择特定类型的文件。这可以确保用户只能选择您的应用程序支持的文件类型。

3、多媒体文件处理: 如果您的应用程序涉及处理多媒体文件,例如图像、音频或视频,您可以使用 QMimeDatabase 来检查文件类型,以便根据文件类型进行不同的操作。例如,您可以通过识别图像文件的 MIME 类型,为用户提供图像预览。

4、文件导入导出: 当您需要导入或导出数据到不同的文件格式时,您可以使用 QMimeDatabase 来识别和验证要导入的文件的 MIME 类型,以确保它们与您的应用程序兼容。

5、文件管理器: 如果您正在构建文件管理器或资源浏览器,您可以使用 QMimeDatabase 来显示文件的类型和图标,从而为用户提供更直观的文件浏览体验。


拖放事件深度剖析

一、Qt中的拖放事件

1、拖放事件概述

(1)、拖放一个文件进入窗口将触发拖放事件

(2)、每一个QWidget对象都能处理拖放事件

(3)、拖放事件的函数为

2、拖放事件中的QMimeData

(1)、QMimeData是Qt中的多媒体数据类

(2)、拖放事件通过QMimeData对象传递数据

(3)、QMimeData支持多种不同的多媒体数据类型

3、常用的MIME类型数据处理函数

4、自定义拖放事件的步骤

(1)、对接收拖放事件的对象调用setAcceptDrops成员函数

(2)、重写dragEnterEvent函数并判断MIME类型

A、期待类型:e->acceptProposedAction()

B、其它数据:e->ignore()

(3)、重写dragEvent()函数并判断MIME类型

A、期待类型:从事件对象中获取MIME数据并处理

B、其它数据:e->ignore()

#include "Widget.h"
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QList>
#include <QDebug>
#include <QUrl>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setAcceptDrops(true);//1.在接收拖放事件的对象里调用setAcceptDrops(true)
}

void Widget::dragEnterEvent(QDragEnterEvent *e)//2.重写void dragEnterEvent(QDragEnterEvent *e)
{
    if(e->mimeData()->hasUrls())//A、期待类型:e->acceptProposedAction()
    {
        e->acceptProposedAction();
    }
    else//B、其它数据:e->ignore()
    {
        e->ignore();
    }
}
void Widget::dropEvent(QDropEvent* e)//3.重写void dropEvent(QDropEvent* p)
{
    if(e->mimeData()->hasUrls())//A、期待类型:从事件对象中获取MIME数据并处理
    {
        QList<QUrl> list = e->mimeData()->urls();

        for(int i = 0; i<list.count(); i++)
        {
            qDebug() << list[i].toLocalFile();//打印路径出来
        }
    }
    else//B、其它数据:e->ignore()
    {
        e->ignore();
    }
}

Widget::~Widget()
{
    
}

二、文本编辑器中的拖放事件

1、打开文件和拖放文件的异同

(1)、打开和拖放都需要先判断是否有数据未保存(所以调用相同的函数)

(2)、保存好数据后打开操作是从弹出的一个文本对话框获取文件路径

(3)、保存好数据后拖放事件是从MimeData里边获取文件路径

(4)、最后通过路径来打开的方式都一样(所以调用相同的函数),所以说区别就是在(2)、(3)

2、文本编辑器拖放事件的解决方案

(1)、调用主窗口对象的setAcceptDrops成员函数

(2)、重写dragEnterEvent函数并判断MIME类型

(3)、重写dragEvent()函数并判断MIME类型后打开文件

void MainWindow::dragEnterEvent(QDragEnterEvent* e)
{
    if(e->mimeData()->hasUrls())
    {
        e->acceptProposedAction();
    }
    else
    {
        e->ignore();
    }
}
void MainWindow::dropEvent(QDropEvent* e)
{
    if(e->mimeData()->hasUrls())
    {
        QList<QUrl> list = e->mimeData()->urls();
        QString path = list[0].toLocalFile();

        QFileInfo fi(path);

        if(fi.isFile())
        {
            preEditorChanged();

            if(!m_isTextChanged)
            {
                openFileToEdit(path);
            }

        }
        else
        {
            showErrorMessage("Canot open a folder");
        }
    }
    else
    {
        e->ignore();
    }

}

修改的文件除了头文件还有:

void MainWindow::onFileOpen()
{

    preEditorChanged();

    if(!m_isTextChanged)
    {
        QString path = showFileDialog(QFileDialog::AcceptOpen, "open");

        openFileToEdit(path);
    }

}

三、小结

(1)、QWidget对象都能处理拖放事件

(2)、自定义拖放事件的方法

A、对接收拖放事件的对象调用setAcceptDrops成员函数

B、重写dragEnterEvent函数并判断MIME类型

C、重写dragEvent()函数并判断MIME类型

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值