首页 > 编程语言 >Qt - macOS上实现Qt应用程序做文件关联打开

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

时间:2023-12-04 11:36:29浏览次数:35  
标签:文件 macOS Qt 应用程序 文档 event

一、背景介绍

    用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里面处理了这个事件,根据需要我们也可以将这个文件路径传到主窗口类中进行后续的打开操作。至此,结合上面的这方面的设置,我们这个功能就完成了。

 

macOS上实现Qt应用程序做文件关联打开 - 24K纯开源 - 博客园 (cnblogs.com)

标签:文件,macOS,Qt,应用程序,文档,event
From: https://www.cnblogs.com/zhuchunlin/p/17874540.html

相关文章

  • kore可扩展安全的Web 应用程序框架
    kore是基于c开发的web框架,可以让我们使用c以及python开发webapi,主要的特点是安全以及可扩展主要特性SNI支持http1.1支持websocket支持默认TLS支持可选后台任务内置参数校验基于acme的自动https权限分离设计可选异步pg访问模块热加载worker进程沙箱支持(基于pledge以及s......
  • Qt程序运行报错
    报错内容PC环境为Ubuntu20.04,Qt版本是Qt5.12.9,AsensingViewer是编译好的程序./AsensingViewer:errorwhileloadingsharedlibraries:libicudata.so.56:cannotopensharedobjectfile:Nosuchfileordirectory问题分析查看程序依赖lddAsensingViewer注意到有个库......
  • Qt/C++音视频开发57-切换音视频轨道/切换节目流/分别切换音频视频轨道
    一、前言对各种音视频文件格式的支持,是一个播放器的基础功能。一般的音视频文件只有1路流,比如音频文件只有1路音频流,视频文件只有1路音频1路视频流,实践过程中发现,还有一种ts格式的文件,可能有多路流,这种格式一般是将多路节目流封装到一个文件中,用户可以根据自己的需要切换不同的节......
  • Qt中QStyledItemDelegate的使用(二)
    延续上一篇文章。本文给出了一个QStyledItemDelegate类自定义绘制加自定义编辑框的例子。为方便读者理清思路,我已经尽量简化本文附加的代码了。此程序模拟用户给出星级评价的效果,在编辑状态下用户可以设置0~5个星星的评价,在普通状态下界面显示对应数量的金黄色星星。本文代码在VS2......
  • Qt 之 QWidget QLabel
    @TOC前言一、Qt工程介绍QtCreator以工程项目的方式对源码进行管理一个QtCreator工程包含不同类型的文件。.pro项目描述文件.pro.user用户配置描述文件-.h头文件.cpp源文件.ui界面描述文件资源文件(图片,音频,等)pro项目描述文件的基本组成#一注释起始符:以“#”开始,到这一行......
  • Apple Safari 17.1.2 - macOS 专属浏览器 (独立安装包下载) 零日漏洞修复
    AppleSafari17.1.2-macOS专属浏览器(独立安装包下载)零日漏洞修复适用于macOSVentura和macOSMonterey的Safari浏览器17请访问原文链接:https://sysin.org/blog/apple-safari-17/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org之前Safari浏览器伴随......
  • “QtRunWork”任务返回了 false,但未记录错误"
    编译一个复制过来的QT工程的时候出现了"errorMSB4181:“QtRunWork”任务返回了false,但未记录错误"。查看工程下的“.log”文件发现在“errorMSB4181:“QtRunWork”任务返回了false,但未记录错误。”的log上面还有一条log是RCC:Errorin'D:\xxxx':Cannotfindfile'xxx......
  • Qt之UDP多播(组播)的使用
    UdpSocket::UdpSocket(QObject*parent):QObject(parent){//本机IPQStringlocal_ip="192.168.101.11";m_udp_socket=newQUdpSocket(this);connect(m_udp_socket,&QUdpSocket::readyRead,this,&UdpSocket::received_data);......
  • .NET Core|--调用C++库|--docker环境下让web api应用程序调用C++类库
    前言#前提安装docker环境~启动docker~#多说一句,为什么我要搞这个一个镜像,既包含gcc开发环境,又包含.NET开发环境我的api应用程序是基于.NET写的,但是我的这个api程序,又要调用c++的一些东西,特别是涉及一些画图之类的,所以就需要gcc的开发环境,最终搞了这么一......
  • 硬件笔记之MacOS打印不清楚或者打印字体发虚
    参考帖子: 求助!!!有人遇到过macOS下打印不清晰吗 此处做个测试说明,系统为Monterey和Ventura,打印机为惠普黑白打印机,即使设置为普通PCL打印机,效果还是发虚有毛边;以下为移除打印机,再次添加打印机后的操作。按照如下设置,让mac自动选择打印机信息后,会自动设置为普通PostScript打印......