19

我想使用 Qt GUI 库作为 VST 插件的用户界面。VST 插件是 Windows 上的 DLL。主机应用程序调用 DLL 上的各种函数,包括openGUI().

我想知道如何从 DLL 中使用 Qt GUI;我已经做了一些研究来看看可能的选择,但我不完全确定这些限制。

主要问题是在哪里创建QApplication对象并调用exec()它(这是一个在应用程序退出之前不会返回的函数)。

我已经查看了这篇文章中给出的解决方案,但是在进一步阅读之后,看起来这个解决方案将无法在 Mac OS X 上运行,因为 Cocoa 对 GUI 可以运行的特定线程有更多限制。这真的有点骇人听闻。

我也看到了这个解决方案,但它依赖于Qt 库,QMfcApp并且QWinWindow它似乎不再是 Qt 库的一部分。

让我的 DLL 自己生成一个新应用程序是唯一的方法吗?大概我可以通过调用QProcess并使用一些共享内存在 GUI 应用程序和我的 VST DLL 之间共享?有没有人遇到过这种类型的问题?我是不是走上了一条糟糕的道路,还是我还没有想到什么?

更新

经过进一步的研究,我遇到了这个QAbstractEventDispatcher班级。我看过这篇文章,它似乎说可以QApplication::processEvents()从您自己的(我的插件的主机)事件循环中调用,而不是调用QApplication::exec(). 有没有人试过这样做?

4

3 回答 3

7

似乎您的实际问题是在 mac 上将 Qt 用于 VST 插件,因为据报道它可以在 Windows 上工作 - 请参阅此处完整源代码树)和此处

在 Qt 论坛中有一个成功的报告在 mac 上使用 Qt for VST 插件,但另一方面,在同一问题上存在一个未解决的错误。

我知道它不能回答您的问题,但我建议使用更适合 VST 插件的其他 UI 库,例如JUCEWDL

于 2012-10-13T11:59:20.460 回答
3

您是否因此而走上了一条糟糕的道路?不一定,如果您正在开发免费的 VST 插件;或者是成功的商业插件开发人员。然而,尽管我喜欢 Qt 用于一般软件开发,但它并不是特别适合 VST 开发。它的许可是这样的,除非您付费,否则您不能将 DLL 与其库静态链接以用于商业用途;而且相当昂贵。当他们把它做成 LGPL 时,它做到了,所以你可以将所有依赖项(这些依赖项很容易运行到十几个 DLL 中)用于目标程序或 DLL 目录中的独立商业程序,它会运行并且你可以出售它商业上;无需购买许可证。

VST 用户习惯于随意移动 DLL 以移动效果;而且他们不能只有一个在 LGPL 下移动。使用大量额外 DLL 扫描的乱扔目录会使扫描过程变慢。在你的 VST 插件的文件夹中有很多依赖项对于商业插件来说不会像其他商业插件那样工作得很好;因为您不能在单个 DLL 中生成插件并将其与 Qt 库静态链接,而无需为 Qt 支付很多费用,或者使其成为 GPL 或类似的东西。

编辑:反对它的一个论点是 Qt 对其信号和插槽进行字符串比较。使用新的连接重载处理信号和插槽的新方法不依赖于字符串。

在本地录音室,在安装 Waves 插件时,我注意到在 {Waves Install Directory}/Application 目录中,有包含 Qt 库的 WavesQtLibs 文件夹。看起来他们正在将 Qt 用于他们的应用程序,但如果他们将 Qt 用于他们自己的插件,他们要么是静态链接,要么不使用它们。由于 Waves 支持针对多个平台的应用程序和插件,我可以看到 Qt 对他们的吸引力。大概他们可以负担得起 Qt 许可证来进行开发。看来他们正在为他们的应用程序使用带有 DLL 的 Qt,这将更容易在操作系统之间移植。我不知道他们是否有使用 LGPL 的必要通知。我不知道他们是否在为他们的插件本身使用 Qt 静态链接,

于 2017-05-13T10:45:14.893 回答
2

从 VST DLL 执行 Qt 进程,然后使用 IPC 在它们之间共享内存(或使用消息传递等)。

于 2012-10-12T15:56:42.923 回答