macOS: рендеринг в окно другого процесса - PullRequest
0 голосов
/ 02 мая 2018

У меня есть приложение Qt, которое нужно использовать из плагина VST. Однако встраивание приложения Qt в плагин кажется невероятно сложной задачей (из-за цикла событий QCoreApplication, поскольку хост может также использовать конфликтующую версию Qt, а также потому, что плагину нужно найти свой собственный набор библиотек Qt).

В качестве обходного пути я хотел бы отобразить мое автономное приложение Qt в окне плагина VST (для которого я знаю HWND / NSView). Это легко сделать в Windows, но немного сложнее в macOS.

tldr: Я читал о NSWindowSharingType / NSWindowSharingReadWrite, который, кажется, предлагает то, что мне нужно в macOS (рендеринг окна процесса в окно другого процесса), но я не могу найти никакого примера, используя тот. Кто-нибудь знает об этом и как его использовать? Или каким-либо другим способом, который позволил бы мне визуализировать мои виджеты Qt в NSView из другого процесса?

1 Ответ

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

Решения для этого вполне номинальны:

  1. Ваша копия Qt должна быть помещена в собственное уникальное пространство имен - то есть вы должны создать свой собственный Qt. В профессиональной обстановке вы все равно должны это делать.

  2. Цикл событий QCoreApplication полностью интегрирован с NSRunLoop. Вам не нужно вызывать exec(), кроме как для запуска цикла событий: то есть выйти из цикла событий, как только он будет запущен, и позволить хост-приложению сделать все остальное. Идиома для этого:

    QTimer::singleShot(0, app, &QCoreApplication::quit);
    app->exec();
    // return to the host app here
    
  3. Плагин может и должен связывать свой собственный Qt, либо в виде связанного каркаса, либо с помощью статического связывания.

Вы также можете передать NSView* на QWindow::fromWinID, IIRC.

...