gpt4 book ai didi

c++ - 从 C++ 应用程序打开 cocoa 模式窗口

转载 作者:太空宇宙 更新时间:2023-11-04 12:47:43 25 4
gpt4 key购买 nike

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

我应该如何进行?

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

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

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

最佳答案

首先尝试用如下代码创建一个新窗口:How do I create a Cocoa window programmatically?

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

这对我有用:

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:指定它的完整路径。

关于c++ - 从 C++ 应用程序打开 cocoa 模式窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50529062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com