Откройте модальное окно какао из приложения c ++ - PullRequest
0 голосов
/ 25 мая 2018

Мне нужно открыть модальный диалог на macOS из приложения C ++ с уровня плагина - нет доступа к любым существующим окнам, дескрипторам и т. Д. (Приложение написано на QT).Так что в основном у меня есть обработчик, в котором мне нужно создать окно и показать его, а затем продолжить после закрытия диалога.

Как мне поступить?

Я создал xib / nib (Файл Window.nib) в Xcode, включил его в папку «Ресурсы» моего комплекта плагинов и затем вызвал это (скомпилировано в файл * .mm):

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

, но похоже, что вторая строка не работает.Возможно я не запускаю это в потоке пользовательского интерфейса?Любые указатели, что еще я могу попробовать?

1 Ответ

0 голосов
/ 25 мая 2018

Сначала попробуйте создать новое окно в коде, как здесь: Как программно создать окно Какао?

И обернуть весь код для запуска в главном потоке.

Это сработало для меня:

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:, чтобы указать полный путь к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...