Qt拖拽文件到窗口、快捷方式打开

大部分客户端都支持拖拽文件的功能,本篇博客介绍Qt如何实现文件拖拽到窗口、快捷方式打开,以我的开源视频播放器项目为例,介绍拖拽视频到播放器窗口打开。

需要注意的是,Qt拖拽文件的功能,不支持以管理员权限启动的项目,例如在VS2022项目属性里设置UAC级别为管理员:

如果是管理员权限,那么Qt拖拽文件的功能将被禁止使用,如果项目必须要用管理权限,可以考虑将管理员权限的功能独立为子进程,主进程是普通权限即可。

Qt的拖拽功能实现

(1)设置可拖拽

cpp 复制代码
setAcceptDrops(true);

(2)重写关于拖拽的事件

cpp 复制代码
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的实现.

运行效果:

当拖拽多个视频时,右侧播放列表会展开。

注意,拖拽时需要检查文件格式,比如我在代码里检查的是视频格式:

cpp 复制代码
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事件呢,比如主窗口上还加了好几层窗口,我这里是写到了视频播放窗口,然后将视频列表信息发信号到主窗口进行播放。

相关推荐
水煎包V:YEDIYYDS8887 小时前
QT QML 实现的摇杆按钮,类似王者荣耀 左边方向导航键
qt·qml·摇杆按钮·导航键
winfield8218 小时前
MCP 协议详解
开发语言·网络·qt
秦jh_10 小时前
【Qt】常用控件(上)
服务器·数据库·qt
刃神太酷啦10 小时前
C++ list 容器全解析:从构造到模拟实现的深度探索----《Hello C++ Wrold!》(16)--(C/C++)
java·c语言·c++·qt·算法·leetcode·list
水煎包V:YEDIYYDS88810 小时前
QT modbus 通信教程,把modbus封装到线程单例中,在线程内完成数据收发,解析。把重要数据以信号方式通知到qml层展示,解决UI卡顿
qt·modbus·线程服务
东哥很忙XH11 小时前
python使用PyQt5开发桌面端串口通信
开发语言·驱动开发·python·qt
汪宁宇12 小时前
如何在QT5+MinGW环境中编译使用QGIS开发地图应用
c++·qt·qgis·mingw·地图库
刺客xs13 小时前
Qt-----QSS样式表
开发语言·javascript·qt
qq_4017004113 小时前
QProgressBar+QSS 进度条
qt
小灰灰搞电子15 小时前
Qt PDF模块详解
数据库·qt·pdf