首页 > 解决方案 > macOS:渲染到另一个进程的窗口

问题描述

我有一个需要从 VST 插件使用的 Qt 应用程序。然而,将 Qt 应用程序嵌入到插件中似乎是一项极其复杂的任务(因为 QCoreApplication 事件循环,因为主机也可能使用冲突的 Qt 版本,并且因为插件需要找到自己的 Qt 库集)。

作为一种解决方法,我想将我的独立 Qt 应用程序渲染到 VST 插件的窗口(我知道 HWND/NSView)。在 Windows 上很容易做到,但在 macOS 上有点棘手。

tldr:我读过关于 NSWindowSharingType / NSWindowSharingReadWrite 的文章,它似乎提供了我在 macOS 上需要的东西(将一个进程的窗口渲染到另一个进程的窗口),但我找不到任何使用它的例子。有人知道这一点以及如何使用它吗?或者任何其他方式可以让我将我的 Qt 小部件从不同的进程渲染到 NSView 中?

标签: macosqtipcnsviewnswindow

解决方案


对此的解决方案是非常名义上的:

  1. 您的 Qt 副本必须放入它自己独特的命名空间中 - 即您必须构建自己的 Qt。在专业环境中,无论如何您都应该这样做。

  2. 事件QCoreApplication循环与NSRunLoop. 除了启动事件循环之外,您不需要调用exec()其他方法:即,一旦事件循环启动就退出事件循环,让主机应用程序完成其余的工作。这方面的成语是:

    QTimer::singleShot(0, app, &QCoreApplication::quit);
    app->exec();
    // return to the host app here
    
  3. 该插件可以并且应该捆绑自己的 Qt,或者作为捆绑的框架,或者通过静态链接。

你也可以传递一个NSView*to QWindow::fromWinID, IIRC。


推荐阅读