macos - macOS:渲染到另一个进程的窗口
问题描述
我有一个需要从 VST 插件使用的 Qt 应用程序。然而,将 Qt 应用程序嵌入到插件中似乎是一项极其复杂的任务(因为 QCoreApplication 事件循环,因为主机也可能使用冲突的 Qt 版本,并且因为插件需要找到自己的 Qt 库集)。
作为一种解决方法,我想将我的独立 Qt 应用程序渲染到 VST 插件的窗口(我知道 HWND/NSView)。在 Windows 上很容易做到,但在 macOS 上有点棘手。
tldr:我读过关于 NSWindowSharingType / NSWindowSharingReadWrite 的文章,它似乎提供了我在 macOS 上需要的东西(将一个进程的窗口渲染到另一个进程的窗口),但我找不到任何使用它的例子。有人知道这一点以及如何使用它吗?或者任何其他方式可以让我将我的 Qt 小部件从不同的进程渲染到 NSView 中?
解决方案
对此的解决方案是非常名义上的:
您的 Qt 副本必须放入它自己独特的命名空间中 - 即您必须构建自己的 Qt。在专业环境中,无论如何您都应该这样做。
事件
QCoreApplication
循环与NSRunLoop
. 除了启动事件循环之外,您不需要调用exec()
其他方法:即,一旦事件循环启动就退出事件循环,让主机应用程序完成其余的工作。这方面的成语是:QTimer::singleShot(0, app, &QCoreApplication::quit); app->exec(); // return to the host app here
该插件可以并且应该捆绑自己的 Qt,或者作为捆绑的框架,或者通过静态链接。
你也可以传递一个NSView*
to QWindow::fromWinID
, IIRC。
推荐阅读
- r - 从 VBA 运行 R 并查看后台发生的情况
- php - 更改 WooCommerce 购物车和结帐页面中的“运输”文本:[重复新]
- javascript - 蚂蚁设计风格
- authorize.net - Authorize.net : createcustomerprofilerequest : E00116 OTS 令牌访问冲突
- graphql - 有没有办法使用 graphql 订阅将数据与聚合一起获取?
- node.js - 当 Node.js API 出现故障时,是否可以阻止 nginx 响应?
- java - 如何在没有 GMT 的情况下使用 java.time.ZonedDateTime 和 format.DateTimeFormatter?
- java - TreeSet.lower() 方法在使用显式比较器构造函数时未返回所需的输出
- postgresql - 气流 2.1.3 使用 pgbouncer 解决 postgresql 问题
- xamarin.forms - Xamarin Android DisplayPromptAsync 无法禁止建议