一、背景介绍

用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. react创建组件的几种方式及其区别

    react创建组件有如下几种方式 ①.函数式定义的无状态组件 ②.es5原生方式React.createClass定义的组件   ③.es6形式的extends React.Component定义的组 ...

  2. BZOJ3456城市规划

    题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通.为了 ...

  3. Python网络编程(3)——SocketServer模块与简单并发服务器

    主要类型 该模块有四个比较主要的类,其中常用的是 TCPServer 和 UDPServer. 1. TCPServer 2. UDPServer 3. UnixStreamServer,类似于TCP ...

  4. Linux基本命令总结(八)

    接上篇: 38,一次性定时计划任务的at命令的用法! 1.命令格式: at[参数][时间] 2.命令功能: 在一个指定的时间执行一个指定任务,只能执行一次,且需要开启atd进程(ps -ef | gr ...

  5. Android TextView

    常用属性 text:文本框中展示的文字 android:text="下载" android:text="@string/tv_text"     ------- ...

  6. Web of science数据下载以数据处理

    目标网站分析 我们要获取的就是这几个数值 程序实现 # -*- coding: utf-8 -*- """ @Datetime: 2019/2/28 @Author: Z ...

  7. pymysql的使用及sql注入

    pymysql简介 pymysql是python操纵mysql的一个模块,本质上是一个socket客户端 pymysql使用 准备数据 #创建数据库db2,如果已存在,请忽略 CREATE DATAB ...

  8. [物理学与PDEs]第2章第2节 粘性流体力学方程组 2.3 广义 Newton 法则---本构方程

    1.  ${\bf P}=(p_{ij})$, 而 $$\bex p_{ij}=-p\delta_{ij}+\tau_{ij}, \eex$$ 其中 $\tau_{ij}$ 对应于摩擦切应力. 2. ...

  9. jQuery提示组件toastr(取代alert)

    给大家推荐一款jquery提示插件:toastr 它是一个可以取代alert的提示信息框,它在PC,移动设备上都有不错的UI效果. 具体使用方法如下: 1.首先在网页头站调用他需要的js和css文件. ...

  10. 【linux】基础知识

    为什么学习Linux? 服务器大多数都是linux操作系统,学习[上线][运维]是我们前端开发工程师的必备技能.Linux系统和maxOS系统十分类似,所以推荐大家使用max电脑工作. Linux的版 ...