cocoa - URL 方案 - Qt 和 mac

标签 cocoa qt macos url

我正在尝试为我的应用程序实现自定义 URL 方案。我已经为 Info.plist 添加了必要的行。调用指定的 URL(例如:myapp://)后,应用程序启动。

如果我想处理 URL,我找到了以下步骤:

@interface EventHandler : NSObject {
}
@end

@implementation EventHandler
- (id)init {
    self = [super init];

    if (self) {
        NSLog(@"eventHandler::init");

        NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];
        [defaultCenter addObserver:self
                        selector:@selector(applicationDidFinishLaunching:)
//                        name:NSApplicationWillFinishLaunchingNotification
          name:NSApplicationDidFinishLaunchingNotification
                        object:nil];
    }
    return self;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
    [appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
}

- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
    NSString* url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
    NSLog(@"%@", url);
}

@end

如果应用程序正在运行,上面的代码就可以工作,但是如果 URL 被调用并且应用程序被终止,则不会捕获该事件。我认为这是因为:NSApplicationDidFinishLaunchingNotification。 将其更改为 NSApplicationWillFinishLaunchingNotification 会导致捕获非事件。也许 Qt 在我之前处理它,但我找不到解决该问题的方法。

最佳答案

我还试图让我的基于 Qt 的应用程序在 Mac 上处理自定义 URL 方案,并沿着与原始海报相同的路径进行操作。事实证明,Qt4 已经支持 Mac 上的 URL 事件,并且无需编写 Objective-C 代码来接收它们。这实际上是当您设置事件处理程序以响应 NSApplicationWillFinishLaunchingNotification 时没有收到任何 URL 事件的原因:Qt 随后注册自己的处理程序。

当触发具有自定义方案的 URL 时,您的 Qt 应用程序将收到 FileOpenEvent。请注意,接收事件的是 QApplication 实例。您可以通过将应用程序子类化为 QApplication 或在标准 QApplication 上安装事件过滤器来捕获它。我选择了第二种方法。

这是我的自定义事件过滤器类 FileOpenEventFilter 的 eventFilter 方法。当事件包含非空 URL 时,它只会发出 urlOpened 信号。它还保存最后打开的 URL,以防事件到达时我的主窗口未完全初始化(当单击自定义 URL 时,当应用程序尚未运行时,会发生这种情况。)

bool FileOpenEventFilter::eventFilter(QObject* obj, QEvent* event)
{
    if (event->type() == QEvent::FileOpen)
    {
        QFileOpenEvent* fileEvent = static_cast<QFileOpenEvent*>(event);
        if (!fileEvent->url().isEmpty())
        {
            m_lastUrl = fileEvent->url().toString();
            emit urlOpened(m_lastUrl);
        }
        else if (!fileEvent->file().isEmpty())
        {
            emit fileOpened(fileEvent->file());
        }

        return false;
    }
    else
    {
        // standard event processing
        return QObject::eventFilter(obj, event);
    }
}

关于cocoa - URL 方案 - Qt 和 mac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6561661/

相关文章:

objective-c - 为什么我的 Nib 窗口立即关闭?

swift - nsslider.integerValue 要求我在更新值之前专注于另一个应用程序

python - 采样/分析 PyObjC 应用程序的最佳方法是什么?

c++ - iphone:在不分配新内存的情况下创建图像

Qt 控制台应用程序 - 终端不会保持打开状态 [在 Ubuntu 中]

python - 未调用 PyQt 窗口焦点事件

macos - cocoa 脚本: Use special string types like raw data

macos - 适用于 iOS 和 Mac 项目的构建工具

ios - 从 NIB 加载自定义类 UIView (IBOutlets nil)

c++ - QString 数字在串行通信中保持不变