一、背景介绍

用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文档中我们可以看到这样一个示例:

   #include <QApplication>
#include <QFileOpenEvent>
#include <QtDebug> class MyApplication : public QApplication
{
public:
MyApplication(int &argc, char **argv)
: QApplication(argc, argv)
{
} bool event(QEvent *event)
{
if (event->type() == QEvent::FileOpen) {
QFileOpenEvent *openEvent = static_cast<QFileOpenEvent *>(event);
qDebug() << "Open file" << openEvent->file();
} return QApplication::event(event);
}
};

示例中继承了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

macOS上实现Qt应用程序做文件关联打开的更多相关文章

  1. macOS平台下Qt应用程序菜单翻译及调整

    一.翻译 在macOS平台上,系统会为应用程序菜单添加一些额外的菜单项.先来看一些典型的例子: 这个是Qt Creator的菜单,系统为应用程序菜单添加了一些桌面显示操作相关的菜单项: 这个是Qt D ...

  2. 在 MacOS 上编译链接 OpenGL 程序

    几个星期以前开始折腾在我的MBA上写 OpenGL 小程序.我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接.网上查了一下,MacOS上的Open ...

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

    最近完成一个项目,到最后关头用QtCreator无法打开UI文件,每次都未响应,用QtDesigner也无法启动 这个问题把我折磨了半天,最后才知道原来是要删除C:\Users\Administrat ...

  4. mac通过wine运行windows程序(将文件关联到windows程序notepad++)

    windows程序功能强大且已经习惯使用了,用mac总感觉不给力,例如记事本工具Notepad++就非常优秀.下面介绍如何在mac系统下通过wine来安装使用notepadd++程序. 1.安装win ...

  5. Linux 修改默认文件关联打开程序

    从总体上讲 /etc/gnome/defaults.list 保存了全局的打开方式-/.local/share/applications/mimeapps.list 保存了个人的打开方式当这两个文件不 ...

  6. bootstarp-fileinput上传 火狐防止拖入文件直接打开新页面

    今日接触了一个bootstarp的上传插件,发现其功能很强大,具体名为bootstarp-fileinput,需要的可以自行度一下. 然后当使用其拖拽功能时,其他浏览器没出毛病,独火狐浏览器拖入时直接 ...

  7. 浏览器上的Qt Quick

    你想不想在浏览器上运行你的Qt Quick程序呢?在Qt 5.12之前,唯一的方法是使用Qt WebGL Streaming技术把界面镜像到浏览器上.但该方法有不少缺陷,下文会说.前不久随着Qt 5. ...

  8. Deepin Linux下为Wine创建文件关联

    在Deepin Linux下,默认地,使用apt安装的Wine并没有创建文件关联,这使得在文件管理器中双击exe等Windows可执行文件时,不能直接运行.为此,必须手动在桌面环境中创建文件关联. 文 ...

  9. ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

    原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 作者:Daniel Roth.Steve Smith ...

随机推荐

  1. 【系统架构】软件核心复杂性应对之道-领域驱动DDD(Domain-Driven Design)

    前言 领域驱动设计是一个开放的设计方法体系,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题,本文将介绍领域驱动的相关概念. 一.软件复杂度的根源 1.业务复杂度(软件的 ...

  2. 洛谷P1258 小车问题(题解)

    https://www.luogu.org/problemnew/show/P1258(题目传送) 看题的第一眼就把题归为二分题,一直向着二分的方向走,却忽略了数学的推理.推理一番后(看了题解),发现 ...

  3. pytest 11 allure2生成html报告

    allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面. 环境准备 1.pyt ...

  4. MQ在高并发环境下,如果队列满了,如何防止消息丢失?

    1.为什么MQ能解决高并发环境下的消息堆积问题? MQ消息如果堆积,消费者不会立马消费所有的消息,不具有实时性,所以可以解决高并发的问题. 性能比较好的消息中间件:Kafka.RabbitMQ,Roc ...

  5. mysql 端口修改

    mysql 修改端口 1.  停止mysql服务 2.  打开文件夹下my.ini文件.(E:\mysql-5.7-3307) 修改文件中的port值,注意两个地方: [client]default- ...

  6. JS正则与PHP正则

  7. 15、解决14中csv用excel打开乱码的问题 open('zhihu.csv','w',newline='',encoding='utf-8-sig')

    解决14中csv用excel打开乱码的问题 ,其实就是在写csv的时候把 utf-8 改成 utf-8-sig open('zhihu.csv','w',newline='',encoding='ut ...

  8. Elasticsearch High Level Rest Client 发起请求的过程分析

    本文讨论的是JAVA High Level Rest Client向ElasticSearch6.3.2发送请求(index操作.update.delete--)的一个详细过程的理解,主要涉及到Res ...

  9. [物理学与PDEs]第1章第7节 媒质中的 Maxwell 方程组 7.1 媒质中的 Maxwell 方程组

    1.媒质的极化 (1) 束缚电荷: 被束缚在原来位置上的电荷. (2) 在电磁场中, 束缚电荷会有一微小的运动, 而产生电偶极矩. 此即称为媒质的极化. (3) 设电极化强度 (单位体积的电偶极矩) ...

  10. maven私库nexus2.11.4迁移升级到nexus3.12.0

    nexus简介 nexus是一个强大的maven仓库管理器,它极大的简化了本地内部仓库的维护和外部仓库的访问. nexus是一套开箱即用的系统不需要数据库,它使用文件系统加Lucene来组织数据 .n ...