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


      大部分客户端都支持拖拽文件的功能,本篇博客介绍Qt如何实现文件拖拽到窗口、快捷方式打开,以我的开源视频播放器项目为例,介绍拖拽视频到播放器窗口打开。
      需要注意的是,Qt拖拽文件的功能,不支持以管理员权限启动的项目,例如在VS2022项目属性里设置UAC级别为管理员:
    在这里插入图片描述
      如果是管理员权限,那么Qt拖拽文件的功能将被禁止使用,如果项目必须要用管理权限,可以考虑将管理员权限的功能独立为子进程,主进程是普通权限即可。

      Qt的拖拽功能实现
    (1)设置可拖拽

    setAcceptDrops(true);
    
    • 1

    (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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    具体代码,可参考我的开源项目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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

      如果有多层视频窗口该怎么写drag事件呢,比如主窗口上还加了好几层窗口,我这里是写到了视频播放窗口,然后将视频列表信息发信号到主窗口进行播放。

  • 相关阅读:
    Sentinel入门
    Vatee万腾平台:创新科技,助力企业腾飞
    linux 配置安装node.js
    数仓工具—Hive源码之SQL解析AntlrWorks的使用(10)
    建议别瞎卷,GitHub乱杀,MySQL DBA 攻坚指南一出,阿里数据库专家都解脱了
    【Linux】线程同步:互斥锁、读写锁、条件变量、自旋锁、屏障
    CiteSpace关键词时区图含义详细解析与注意事项
    Mac OS中Git版本更新(亲测有效)
    vue2中,下拉框多选和全选的实现
    Node Sass does not yet support your current environment
  • 原文地址:https://blog.csdn.net/yao_hou/article/details/133841805