支持拖拽媒体资源的基类

#pragma once

#include <QWidget>
class QDragEnterEvent;
class QDropEvent;
class MaterialWidget : public QWidget
{
    Q_OBJECT
public:
	enum MaterialType
	{
		MaterialType_error = -1,                                    // 错误类型
		MaterialType_folder = 0X000,                                // 文件夹
		MaterialType_video = 0X0001,                                // 视频
		MaterialType_audio = 0X0010,                                // 音频
		MaterialType_ppt = 0X0100,                                  // ppt
		MaterialType_picture = 0X1000,                              // 图片
		MaterialType_meida = MaterialType_video | MaterialType_ppt, // 媒体类型
	};

public:
    explicit MaterialWidget(QWidget *parent = nullptr);
	
public:	
		// 获取支持的类型
	void setMaterialType(MaterialType type);
	MaterialType getMaterialType();
	
protected:
	virtualvoid dragEnterEvent(QDragEnterEvent * event) override;
	virtual void dropEvent(QDropEvent * event) override;
	
private:
	MaterialType getFileMaterialType(const QString &strFilePath);
	QStringList getFilePathList(const QString & strPath);
	
signals:
	// 外部文件拖拽进入
	void signalExteranlFileDropEnter(QPoint pos, QStringList fileNameList);
	
private:
	MaterialType						mMaterialType;
}
#include "MaterialWidget.h"
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QDir>
#include <QMimeData>

MaterialWidget::MaterialWidget(QWidget *parent)
	: QWidget(parent)
	, mMaterialType(MaterialType_error)
{
	this->setObjectName("MaterialWidget");
	this->setAcceptDrops(true);
}

void MaterialWidget::setMaterialType(MaterialType type)
{
	if (mMaterialType != type)
	{
		mMaterialType = type;
	}

}

MaterialWidget::MaterialType MaterialWidget::getMaterialType()
{
	return mMaterialType;
}

void MaterialWidget::dragEnterEvent(QDragEnterEvent * event)
{
	event->accept();
}

void MaterialWidget::dropEvent(QDropEvent * event)
{
	if (mMaterialType == MaterialType_error || mMaterialType == MaterialType_folder)
	{
		return;
	}
	// 获得拖动源
	QObject* pSource = event->source();
	// 外部拖入
	if (!pSource)
	{
		QList<QUrl> urls = event->mimeData()->urls();
		if (urls.isEmpty())
		{
			return;
		}
		QStringList fileNameList;
		for (QList<QUrl>::iterator itr = urls.begin(); itr != urls.end(); itr++)
		{
			QStringList childPath = getFilePathList(QDir::toNativeSeparators((*itr).toLocalFile()));
			if (!childPath.empty())
			{
				fileNameList.append(childPath);
			}	
		}

		if (!fileNameList.empty())
		{
			emit signalExteranlFileDropEnter(event->pos(), fileNameList);
		}
	}
}
MaterialWidget::MaterialType MaterialWidget::getFileMaterialType(const QString &strFilePath)
{
	QFileInfo fileInfo;
	fileInfo.setFile(strFilePath);

	if (fileInfo.isDir())
	{
		return MaterialType_folder;
	}

	QString strSuffix = fileInfo.suffix();
	if (strSuffix.compare("avi", Qt::CaseInsensitive) == 0 || strSuffix.compare("wmv", Qt::CaseInsensitive) == 0 || strSuffix.compare("rmvb", Qt::CaseInsensitive) == 0 || strSuffix.compare("rm", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("mp4", Qt::CaseInsensitive) == 0 || strSuffix.compare("mid", Qt::CaseInsensitive) == 0 || strSuffix.compare("3gp", Qt::CaseInsensitive) == 0 || strSuffix.compare("mpg", Qt::CaseInsensitive) == 0 || strSuffix.compare("mkv", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("mov", Qt::CaseInsensitive) == 0 || strSuffix.compare("mpeg", Qt::CaseInsensitive) == 0 || strSuffix.compare("m2v", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("ts", Qt::CaseInsensitive) == 0 || strSuffix.compare("mts", Qt::CaseInsensitive) == 0 || strSuffix.compare("m2t", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("m2ts", Qt::CaseInsensitive) == 0 || strSuffix.compare("flv", Qt::CaseInsensitive) == 0 || strSuffix.compare("f4v", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("m4v", Qt::CaseInsensitive) == 0 || strSuffix.compare("dat", Qt::CaseInsensitive) == 0 || strSuffix.compare("vob", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("webm", Qt::CaseInsensitive) == 0
		)
	{
		return MaterialType_video;
	}
	else if (strSuffix.compare("bmp", Qt::CaseInsensitive) == 0 || strSuffix.compare("jpg", Qt::CaseInsensitive) == 0 || strSuffix.compare("jpeg", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("png", Qt::CaseInsensitive) == 0 || strSuffix.compare("ico", Qt::CaseInsensitive) == 0 || strSuffix.compare("cur", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("tiff", Qt::CaseInsensitive) == 0 || strSuffix.compare("tif", Qt::CaseInsensitive) == 0 || strSuffix.compare("tga", Qt::CaseInsensitive) == 0)
	{
		return MaterialType_picture;
	}
	else if (strSuffix.compare("mp3", Qt::CaseInsensitive) == 0 || strSuffix.compare("wav", Qt::CaseInsensitive) == 0 || strSuffix.compare("wma", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("ape", Qt::CaseInsensitive) == 0 || strSuffix.compare("aac", Qt::CaseInsensitive) == 0 || strSuffix.compare("amr", Qt::CaseInsensitive) == 0
		|| strSuffix.compare("ogg", Qt::CaseInsensitive) == 0 || strSuffix.compare("m4a", Qt::CaseInsensitive) == 0 || strSuffix.compare("flac", Qt::CaseInsensitive) == 0)
	{
		return MaterialType_audio;
	}
	else if (strSuffix.compare("ppt", Qt::CaseInsensitive) == 0 || strSuffix.compare("pptx", Qt::CaseInsensitive) == 0)
	{
		return MaterialType_ppt;
	}
	return MaterialType_error;
}

QStringList MaterialWidget::getFilePathList(const QString & strPath)
{
	QStringList pathList;
	MaterialType type = getFileMaterialType(strPath);
	if (type == MaterialType_folder)
	{
		QDir dir(strPath);
		for (int i = 0; i < dir.entryList().size(); i++)
		{
			QString qsFileName = dir.entryList().at(i);
			if (qsFileName == "." || qsFileName == "..")
			{
				continue;
			}

			QStringList childPath = getFilePathList(strPath + QDir::separator() + qsFileName);
			if (!childPath.empty())
			{
				pathList.append(childPath);
			}
		}
	}
	else if(type != MaterialType_error)
	{
		if ((mMaterialType & type) == type)
		{
			pathList.push_back(strPath);
		}
	}

	return pathList;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值