专栏首页24K纯开源macOS上实现Qt应用程序做文件关联打开

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

 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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Qt 通过自定义 URL Scheme 给已经运行的应用传参(Windows&macOS)

    在传统的应用程序设计中,我们可以看到很多通过浏览器唤起本地应用的案例,比如百度网盘、迅雷等工具,他们在浏览器访问一个非 http/https 协议开头的地址时,...

    我与梦想有个约会
  • xmake v2.3.8 发布, 新增 Intel C++/Fortran 编译器支持

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更...

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

    在macOS平台上,系统会为应用程序菜单添加一些额外的菜单项。先来看一些典型的例子:

    24K纯开源
  • Qt 5.14版本更新细节

      以下模块是Qt 5.14发行版的一部分,但已弃用,并考虑在后续的Qt发行版中删除:

    Qt君
  • xmake v2.5.1 发布, 支持 Apple Silicon 并改进 C/C++ 包依赖管理

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更...

    ruki
  • .NET 6 预览版发布,Python的跨平台地位受到挑战

    跨平台是最近几年非常火的主题,因为现在的各种平台简直太多了。Windows、macOS、Linux、Android、iOS、Web、小程序、IoT等等。以后还可...

    蒙娜丽宁
  • xmake v2.3.3 发布, 新增iOS/MacOS Framework和App构建支持

    这个版本主要是对内置的构建规则做了些扩展,新增了相关规则来实现对iOS/MacOS相关App应用程序项目、Framework和Bundle程序的构建支持。

    ruki
  • 翻译 | Qt 5.15中自定义窗口的装饰

      这只是Qt 5.15中一个新功能的快速更新,我对此感到非常兴奋。传统上,窗口装饰一直是一件很无聊的事情。标题栏,边框,最小化,最大化,调整大小和退出,差不多...

    Qt君
  • 不一样的软件们——GitHub 热点速览 v.21.10

    创意,是程序员的一个身份代名词,一样的软件有不一样的玩法。比如,你可以像用 git 一样操作一个 SQL 数据库,dolt 就是这样的数据库。又比如,你可以只写...

    HelloGitHub

扫码关注云+社区

领取腾讯云代金券