DLL(VST插件)中的Qt GUI环境

Qt GUI environment in a DLL (VST Plugin)

本文关键字:Qt GUI 环境 中的 VST 插件 DLL      更新时间:2023-10-16

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

我想知道如何从DLL使用QtGUI;我做了一些研究来寻找可能的选择,但我不完全确定其局限性。

主要问题是在哪里创建QApplication对象并对其调用exec()(这是一个直到应用程序退出才返回的函数)。

我已经看过这篇文章中给出的解决方案,但在进一步阅读后,这个解决方案似乎在Mac OS X上不起作用,因为Cocoa对GUI可以运行的特定线程有更严格的限制。这真的有点像黑客。

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

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

更新

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

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

在Qt论坛上有一篇关于在mac上使用Qt进行VST插件的成功报道,但另一方面,在同一问题上也有一个开放的bug。

我知道它不能回答你的问题,但我建议使用其他更适合VST插件的UI库,如JUCE和WDL。

你这样做是不是很糟糕?不一定,如果你正在开发一个免费的VST插件;或者是一个成功的商业插件开发人员。然而,尽管我非常喜欢用于通用软件开发的Qt,但它并不特别适合VST开发。它的许可是这样的,你不能静态链接DLL和它的库用于商业用途,除非你为此付费;而且相当昂贵。当他们制作LGPL时,它让你可以将所有的依赖项(很容易运行到十几个DLL中)放在目标程序或DLL目录中,用于独立的商业程序,它会运行,你可以将其商业化销售;没有购买许可证。

VST用户习惯于随意移动DLL,以便移动效果;在LGPL的领导下,他们不可能只有一个人可以四处走动。目录中有很多额外的DLL需要扫描,这会使扫描过程变慢。在你的VST插件的文件夹中有很多依赖关系,这对商业插件来说不会像对其他商业插件那样好用;因为你不能在一个DLL中生成一个插件,并将其与Qt库静态链接,而不为Qt支付大量费用,或者使其成为GPL或诸如此类的东西。

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

在当地的一家录音棚,在Waves插件安装中,我注意到在{Waves Install Directory}/Application目录中,有WavesQtLibs文件夹,其中包含Qt库。他们似乎在为自己的应用程序使用Qt,但如果他们自己将Qt用于插件,他们要么静态链接,要么不使用Qt。由于Waves支持多个平台的应用程序和插件,我可以看到Qt对他们的吸引力。据推测,他们可以负担得起Qt的开发许可证。看来他们的应用程序使用的是带有DLL的Qt,这将使操作系统之间的端口更容易。我不知道他们是否有LGPL使用的必要通知。我不知道他们是否在为自己的插件使用静态链接的Qt,是否在使用JUCE框架(虽然有点贵,但也没有在价格上骗取其有限的用户基础),或者其他什么。

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