我正在编写一个应用程序,在这个应用程序中,我只想接受音频和视频类型。
这是Qt5中用于放置小部件的代码:
void DragDropFrame::dragEnterEvent(QDragEnterEvent* evt)
{
if (frame_type == FRAME_TYPE::DROPPABLE)
{
if (evt->mimeData()->hasFormat("audio/*"))
{
evt->acceptProposedAction();
}
else
evt->ignore();
}
else
evt->ignore();
}
然而"音频/ *"不起作用。小部件不接受任何文件。我是否必须" if-else"所有可能的音频和视频MIME类型还是有另一种更快的解决方案吗?
答案 0 :(得分:1)
QMimeData::hasFormat
不会处理任何类型的通配符。它只是检查您指定的mimetype是否在支持的格式列表中按原样存在(参见the implementation)。
您需要获取受支持的formats()
列表,并搜索以audio/
或video/
开头的任何字符串。
答案 1 :(得分:1)
不,没有像这样的通用MIME类型。
evt
将告诉您它所拥有的特定MIME类型。您可以进行子串/模式匹配,以查看是否有任何类型匹配您要查找的内容,例如:
void DragDropFrame::dragEnterEvent(QDragEnterEvent* evt)
{
if (frame_type == FRAME_TYPE::DROPPABLE)
{
QStringList formats = evt->mimeData()->formats();
if (!formats.filter("audio/").empty() ||
!formats.filter("video/").empty())
{
evt->acceptProposedAction();
return;
}
}
evt->ignore();
}
可替换地:
void DragDropFrame::dragEnterEvent(QDragEnterEvent* evt)
{
if (frame_type == FRAME_TYPE::DROPPABLE)
{
QRegExp regex("\\b(audio|video)/*", Qt::CaseInsensitive, QRegExp::Wildcard);
if (!evt->mimeData()->formats().filter(regex).empty())
{
evt->acceptProposedAction();
return;
}
}
evt->ignore();
}