macOS上实现Qt应用程序做文件关联打开
一、背景介绍
用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应用程序做文件关联打开的更多相关文章
- macOS平台下Qt应用程序菜单翻译及调整
一.翻译 在macOS平台上,系统会为应用程序菜单添加一些额外的菜单项.先来看一些典型的例子: 这个是Qt Creator的菜单,系统为应用程序菜单添加了一些桌面显示操作相关的菜单项: 这个是Qt D ...
- 在 MacOS 上编译链接 OpenGL 程序
几个星期以前开始折腾在我的MBA上写 OpenGL 小程序.我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接.网上查了一下,MacOS上的Open ...
- 关于Qt Designer程序/UI文件打开未响应的解决方法
最近完成一个项目,到最后关头用QtCreator无法打开UI文件,每次都未响应,用QtDesigner也无法启动 这个问题把我折磨了半天,最后才知道原来是要删除C:\Users\Administrat ...
- mac通过wine运行windows程序(将文件关联到windows程序notepad++)
windows程序功能强大且已经习惯使用了,用mac总感觉不给力,例如记事本工具Notepad++就非常优秀.下面介绍如何在mac系统下通过wine来安装使用notepadd++程序. 1.安装win ...
- Linux 修改默认文件关联打开程序
从总体上讲 /etc/gnome/defaults.list 保存了全局的打开方式-/.local/share/applications/mimeapps.list 保存了个人的打开方式当这两个文件不 ...
- bootstarp-fileinput上传 火狐防止拖入文件直接打开新页面
今日接触了一个bootstarp的上传插件,发现其功能很强大,具体名为bootstarp-fileinput,需要的可以自行度一下. 然后当使用其拖拽功能时,其他浏览器没出毛病,独火狐浏览器拖入时直接 ...
- 浏览器上的Qt Quick
你想不想在浏览器上运行你的Qt Quick程序呢?在Qt 5.12之前,唯一的方法是使用Qt WebGL Streaming技术把界面镜像到浏览器上.但该方法有不少缺陷,下文会说.前不久随着Qt 5. ...
- Deepin Linux下为Wine创建文件关联
在Deepin Linux下,默认地,使用apt安装的Wine并没有创建文件关联,这使得在文件管理器中双击exe等Windows可执行文件时,不能直接运行.为此,必须手动在桌面环境中创建文件关联. 文 ...
- 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 ...
随机推荐
- JavaScript闭包应用的整理
0 什么是JavaScript闭包? 当函数定义内部的函数被保存到外部时,就会形成闭包.闭包会导致作用域链不释放,造成内存泄漏. 1 获取局部变量 [练习目的] 下面这个练习,是为了通过闭包实现获取定 ...
- Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
一.前言 this.$router.go(-1)返回上级路由 二.主要内容 1.小功能演示: 2.组件之间的嵌套关系为: 3.具体实现 (1)由于这种返回按钮在每个页面中的结构都是一样的,只是里面的数 ...
- C# 数独算法——LINQ+委托
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sing ...
- C#获取根目录的方法总结
1.控制台应用程序 static void Main(string[] args) { //1.Environment.CurrentDirectory Console.WriteLine(Envir ...
- 【1】JDK8 HashMap扩容优化
JDK1.7 VS JDK1.8 比较 优化概述: resize 扩容优化 引入了红黑树,目的是避免单条链表过长而影响查询效率 解决了resize时多线程死循环问题,但仍是非线程安全的 这里主要讲讲扩 ...
- [物理学与PDEs]第1章第7节 媒质中的 Maxwell 方程组 7.2 媒质交界面上的条件
通过 Maxwell 方程组的积分形式易在交界面上各量应满足交界面条件: $$\beex \bea \sez{{\bf D}}\cdot{\bf n}=\omega_f,&\sex{\omeg ...
- 循环语句(for,while,do……while),方法概述
循环结构 分类:for,while,do……while (1)for语句 格式: for(初始化表达式:条件表达式:循环后的操作表达式){ 循环体: } 执行流程: a.执行初始化语句 b.执行判断条 ...
- jsonp简介
jsonp主要是利用script的跨域.简单点说就是像img,css,js这样的文件是跨域的,这也就是为什么我们能够利用cdn进行加速的原因.而且像js这样的文件,如果里面是一个自执行的代码,比如: ...
- pythonのsimple_tag
当我们需要在页面种直接调用py文件中的某些方法时,我们就要用到simple_tag.具体步骤如下: 1.在某个app下创建templatetags文件夹,切记该名称是不可以改变的. 2.在该文件夹下创 ...
- pythonのdjango
Django(醤糕) 是基于MTV的框架 安装: pip3 install django 重要性:相当于出门带不带腿 创建工程 django-admin startproject [工程名称] 工程目 ...