一、背景介绍

用Qt开发的应用程序要实现文件关联,双击时用默认关联的程序打开文件,在Windows上这个功能非常容易实现。Windows应用程序在安装的时候可以在注册表中写入相关的键值对。打开文件的时候,Windows Explorer会将文件完整的路径作为参数传递给关联的应用程序。这样就可以在启动程序后将这个文件作为目标进行处理。

如上述代码所示,接着我们就可以在main函数的argv中获取到文件路径,完成文件的关联打开。但是在macOS上却不是这么做的。首先macOS上没有类似Windows注册表,不会写入这些信息;其次,macOS上常见的安装包格式pkg也不提供这些功能。那么,在macOS上我们应该怎么来实现这样的功能呢?我们马上来看看。

首先,要实现双击用关联程序打开文件这个功能,要分两个步骤:(1)通过某种方式来声明我们的应用程序支持哪些文档类型;(2)要接收从窗口管理系统传递过来的文件路径。满足了这两点,才能正常实现目标功能。

(1)文件格式关联声明

在macOS上,每个应用程序里面都会包含一个info.plist文件。这个文件以XML格式来组织一些键值对。每个键值对都包含声明了一个特定的信息,如版本号、文档类型、签名信息和标识符等。应用程序支持哪些文档格式也是在这个文件里面进行声明的。

可以看到,这个info.plist文件里面我们添加了三种文档格式。每当尝试使用应用程序来打开一个文档时,都会根据这些信息来确定是否支持打开。

(2)接收目标文档路径

在macOS上打开一个文档时,macOS Finder不会像Windows Explorer一样将文件名作为关联程序的启动参数。我们测试的时候也可以发现,程序启动的时候main函数的argc参数值永远是1,除了程序名之外不会有其他参数存在。事实上,在macOS上我们用Qt开发的程序可以监听QFileOpenEvent这样一个事件,来实现对文件路径的捕获。

在Qt文档中我们可以看到这样一个示例:

 1   #include <QApplication>
 2   #include <QFileOpenEvent>
 3   #include <QtDebug>
 4
 5   class MyApplication : public QApplication
 6   {
 7   public:
 8       MyApplication(int &argc, char **argv)
 9           : QApplication(argc, argv)
10       {
11       }
12
13       bool event(QEvent *event)
14       {
15           if (event->type() == QEvent::FileOpen) {
16               QFileOpenEvent *openEvent = static_cast<QFileOpenEvent *>(event);
17               qDebug() << "Open file" << openEvent->file();
18           }
19
20           return QApplication::event(event);
21       }
22   };

示例中继承了QApplication类,并在event函数中处理了QFileOpenEvent事件。这个事件可以直接获取到正在打开的文件名和文件路径,也就实现了我们的目的了。这里我们在QApplication里面处理了这个事件,根据需要我们也可以将这个文件路径传到主窗口类中进行后续的打开操作。至此,结合上面的这方面的设置,我们这个功能就完成了。

二、参考链接

1. https://forum.qt.io/topic/80205/open-file-with-double-click-on-mac/8
2. https://stackoverflow.com/questions/26849866/unable-to-open-file-with-qt-app-on-mac
3. https://doc.qt.io/qt-5/qfileopenevent.html

转载于:https://www.cnblogs.com/csuftzzk/p/qt_macos_file_association_open.html

macOS上实现Qt应用程序做文件关联打开相关推荐

  1. 关于Qt Designer程序/UI文件打开未响应的解决方法

    关于Qt Designer程序/UI文件打开未响应的解决方法 参考文章: (1)关于Qt Designer程序/UI文件打开未响应的解决方法 (2)https://www.cnblogs.com/ys ...

  2. Linux文件关联详解 linux 修改默认文件关联打开程序

    linux 修改默认文件关联打开程序 从总体上讲 /etc/gnome/defaults.list 保存了全局的打开方式 /.local/share/applications/mimeapps.lis ...

  3. qt 服务器数据库文件,qt用什么数据库文件怎么打开

    qt用什么数据库文件怎么打开 内容精选 换一换 云服务器新增磁盘,开机自动执行磁盘初始化脚本后,Oralce.MySQL和SQL Server等数据库系统日志Msg 823错误 .磁盘初始化脚本Win ...

  4. 181216 MacOs上如何将多页PDF文件合成打印在一张PDF表单上面

    Youtube视频: Mac | Printing pdf document with multiple pages per sheet 使用MacOs默认的PDF阅读器 文件-打印 布局 选择每张纸 ...

  5. 在macOS上交叉编译arm64的程序并在IOS上运行

    0x01 两种编译方式如下: 简单编写一个demo.c #include <stdio.h> int main() {printf("i am include"); r ...

  6. 微信小程序-下载文件并打开/下载视频播放视频/下载音频文件-Android和IOS调试终版

    下载文件并预览: 调接口下载文件,接口返回的是.bin类型的临时文件,直接调用uniapp原生接口openDocument可能出现打不开的情况或者可能打开文件乱码异常,所以我们需要获取一下文件类型fi ...

  7. cgdb 调试_在MacOS上使用gdb(cgdb)调试Golang程序

    如果你在MacOS上使用GDB工具载入Golang程序时无法载入,这篇文章可以解决.本文不具体介绍调试的方法,网上的文章太多了就不赘述了. cgdb使用的是gdb的内核,方法和原理试用本文. 问题分析 ...

  8. xilinx soc学习笔记之在Ubuntu上安装Qt 5

    介绍 这是将Qt 5.7.0安装到Ubuntu 12.10的教程.它可能用于某些较新版本的Qt和Ubuntu.作为反例,Ubuntu 16.04 LTS使用独立的系统来控制Qt版本.遵循以下针对Ubu ...

  9. macOS上如何应对崩溃问题

    这是前一篇文章 https://blog.csdn.net/LGYXDN/article/details/118215454 的超集. macOS上进程崩溃时生成dump文件 首先确保 /cores  ...

最新文章

  1. python的直接赋值不会拷贝,只相当于变量的一个别名
  2. C++11 正则表达式——实例1
  3. 区块链 java 开源_详细介绍Java区块链开源代码背后的内容
  4. 微博收藏(机器学习代码与工具)(一)
  5. 十四、矩阵的快速转置算法
  6. axios,vue-axios在项目中的应用
  7. SAP中国招聘内部顾问,工作职责是做客户项目,ABAP开发
  8. 【Xamarin.Android】掌握android支持库
  9. Tensorflow 卷积神经网络 (四)cifar100实战
  10. JAVA水晶花数_我的世界Java版1.17快照20w45a新增物品详解
  11. jQuery三天复习.md
  12. 理论到实践带你了解情感分析、信息抽取、搜索推荐等NLP相关任务
  13. 吴恩达 深度学习 2021版 作业
  14. MATLAB实现离散信号的DTFT和DFT
  15. 如何使用记事本和cmd执行java代码
  16. 什么是全景(360全景、720全景、VR全景)?
  17. 关于技术美术的一些个人理解
  18. 一阶系统开环传递函数表达式_机械振动理论(2)-多自由度系统
  19. 景深--摄影基础理论(1)
  20. 绘图工具——绘制地图

热门文章

  1. C#--数据类型和类型转换
  2. 常见宽带错误解决方法
  3. 微服务架构下,静态数据通用缓存机制!
  4. 阿里云专家手把手教你重塑 IT 架构!
  5. Google MapReduce有啥巧妙优化?
  6. WSP框架:WEB组件的原理
  7. 【Python】青少年蓝桥杯_每日一题_10.11_小球反弹
  8. Android --- log.e(),log.d(),log.i()等的区别
  9. html5+css3网页制作:三栏布局宽度自适应,css三栏布局的五种写法,中间自适应,左右宽度固定...
  10. linux复制文件命令cat ,Linux学习之四(复制移动文件命令cp等及查看文本命令cat等)2017-03-28...