从 c++ 应用程序打开可可模式窗口

Open cocoa modal window from c++ application

本文关键字:可可 模式 窗口 c++ 应用程序      更新时间:2023-10-16

我需要从插件级别从应用程序在 macOS 上打开一个模式对话框C++ - 无法访问任何现有的窗口、句柄等(应用程序是用 QT 编写的(。所以基本上我有一个处理程序,我需要在其中构造窗口并显示它,然后在对话框关闭后继续。

我应该怎么做?

我在 Xcode 中创建了 xib/nib (Window.nib( 文件,将其包含在插件包的资源文件夹中,然后调用了这个(编译在 *.mm 文件中(:

NSWindowController * windowController = 
[[NSWindowController alloc] initWithWindowNibName:@"Window"];
[[NSApplication sharedApplication] runModalForWindow: 
windowController.window];

但看起来第二行失败了。也许我没有在 UI 线程中运行它?任何指示我还能尝试什么?

首先尝试在代码中创建一个新窗口,如下所示: 如何以编程方式创建 Cocoa 窗口?

并包装要在主线程中运行的所有代码。

这对我有用:

MyDialog (NSWindowController(

@interface MyDialog : NSWindowController
- (instancetype)initWithFrame:(NSRect)frame;
- (void)runModal;
@end
@implementation MyDialog
- (instancetype)initWithFrame:(NSRect)frame {
NSWindowStyleMask windowMask = NSWindowStyleMaskTitled
| NSWindowStyleMaskClosable | NSWindowStyleMaskResizable;
NSWindow *window = [[NSWindow alloc] initWithContentRect:frame
styleMask:windowMask
backing:NSBackingStoreBuffered
defer:NO];
[NSNotificationCenter.defaultCenter addObserver:self
selector:@selector(windowWillClose:)
name:NSWindowWillCloseNotification
object:nil];
return [super initWithWindow:window];
}
- (void)dealloc {
[NSNotificationCenter.defaultCenter removeObserver:self];
}
- (void)runModal {
[[NSApplication sharedApplication] runModalForWindow:self.window];
}
- (void)windowWillClose:(NSNotification *)notification {
[[NSApplication sharedApplication] stopModal];
}
@end

内部呈现功能:

[NSOperationQueue.mainQueue addOperationWithBlock:^{
NSRect frame = NSMakeRect(0, 0, 200, 200);
MyDialog *dialog = [[MyDialog alloc] initWithFrame:frame];
[dialog runModal];
NSLog(@"done");
}];

如果这有效,您可以在 Window.xib 的帮助下获得相同的结果,但您需要确保相应的 Window.nib 文件(编译的 xib(存在,并且可以在运行时从插件中找到它。如果将此文件放在插件资源中的某个位置,则可以使用initWithWindowNibPath:指定它的完整路径。