>

플러그인 수준에서 C ++ 응용 프로그램의 macOS에서 모달 대화 상자를 열어야합니다. 기존 창, 핸들 등에 액세스 할 수 없습니다 (응용 프로그램은 QT로 작성 됨). 따라서 기본적으로 창을 구성하고 표시 한 다음 대화 상자를 닫은 후에 계속 해야하는 처리기가 있습니다.

어떻게 진행해야합니까?

Xcode에서 xib/nib (Window.nib) 파일을 생성하고 플러그인 번들의 Resources 폴더에 포함시킨 다음 이것을 호출했습니다 (* .mm 파일로 컴파일) :

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

그러나 두 번째 줄은 실패한 것 같습니다. 아마도 UI 스레드에서 실행하지 않습니까? 다른 시도로 할 수있는 것이 있습니까?

  • 답변 # 1

    먼저 다음과 같은 코드로 새 창을 만들어보십시오. 프로그래밍 방식으로 Cocoa 창을 작성하려면 어떻게합니까?

    모든 코드를 감싸서 메인 스레드에서 실행하십시오.

    이것은 나를 위해 일했다 :

    내 대화 상자 (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: 를 사용할 수 있습니다  전체 경로를 지정합니다.

관련 자료

  • 이전 sql - mysql - max () 및 group by ()가 예상 한 결과가 아님
  • 다음 c# - 이미지를 바이트 배열로 변환하는 방법