大部分客户端都支持拖拽文件的功能,本篇博客介绍Qt如何实现文件拖拽到窗口、快捷方式打开,以我的开源视频播放器项目为例,介绍拖拽视频到播放器窗口打开。
需要注意的是,Qt拖拽文件的功能,不支持以管理员权限启动的项目,例如在VS2022项目属性里设置UAC级别为管理员:
如果是管理员权限,那么Qt拖拽文件的功能将被禁止使用,如果项目必须要用管理权限,可以考虑将管理员权限的功能独立为子进程,主进程是普通权限即可。
Qt的拖拽功能实现
(1)设置可拖拽
setAcceptDrops(true);
(2)重写关于拖拽的事件
void VideoWidget::dragEnterEvent(QDragEnterEvent* event)
{if (event->mimeData()->hasFormat("text/uri-list")) {event->acceptProposedAction();}
}// 注意windows下如果使用管理员权限,Qt的拖拽功能将被禁止
void VideoWidget::dropEvent(QDropEvent* event)
{QList<QUrl> urls = event->mimeData()->urls();if (urls.isEmpty())return;QStringList video_list;// 遍历 URL 列表for (const QUrl& url : urls) {// 将 URL 转换为本地文件路径QString filePath = url.toLocalFile();if (isVideoFile(filePath)){video_list.append(filePath);}}if (video_list.size() < 1){return;}emit sig_OpenFile(video_list);
}
具体代码,可参考我的开源项目QQMediaPlayerCopy的实现.
运行效果:
当拖拽多个视频时,右侧播放列表会展开。
注意,拖拽时需要检查文件格式,比如我在代码里检查的是视频格式:
bool VideoWidget::isVideoFile(const QString& filePath)
{// 创建一个 QFileInfo 对象,它提供了关于文件的信息QFileInfo fileInfo(filePath);// 获取文件的后缀QString fileSuffix = fileInfo.suffix().toLower();// 定义一个包含常见视频文件后缀的字符串列表QStringList videoSuffixes = { "mp4", "mkv", "avi", "mov", "flv", "wmv" };// 检查文件后缀是否在视频后缀列表中return videoSuffixes.contains(fileSuffix);
}
如果有多层视频窗口该怎么写drag事件呢,比如主窗口上还加了好几层窗口,我这里是写到了视频播放窗口,然后将视频列表信息发信号到主窗口进行播放。