#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;
}