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

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

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

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

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

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

(1)文件格式关联声明

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

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

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

    可以看到,这个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 };

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfpfy.html