【问题标题】:Qt GUI environment in a DLL (VST Plugin)DLL 中的 Qt GUI 环境(VST 插件)
【发布时间】:2012-09-30 01:58:56
【问题描述】:

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

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

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

我查看了this post 中给出的解决方案,但在进一步阅读之后,似乎该解决方案不适用于 Mac OS X,因为 Cocoa 对 GUI 可以运行的特定线程有更多限制。这真的有点像黑客。

我也见过this solution,但这依赖于QMfcAppQWinWindow,它们似乎不再是Qt 库的一部分。

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

更新

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

【问题讨论】:

  • 我已经在 Windows 上完成了(第一个使用单独线程的解决方案)。这真的很困难,因为我们需要从 dllmain 中启动一个单独的线程,这是被禁止的。 QMfcApp 从来都不是 Qt 的一部分,而是一个所谓的“解决方案”。你可以在这里找到它qt.gitorious.org/qt-solutions/qt-solutions/trees/master/…。祝你好运!

标签: c++ qt user-interface dll vst


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的实际问题似乎是在 mac 上将 Qt 用于 VST 插件,因为据报道它可以在 Windows 上运行 - 请参阅 here (full source tree) 和 here

    有一个成功的报告在mac上使用Qt for VST插件in the Qt forums,但另一方面有一个open bug在同一问题上。

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

    【讨论】:

    • 我想知道还有哪个库,也许是你提到的两个库,实际上解决了这个问题。我目前正在研究将哪个跨平台 gui 库用于类似类型的插件。如果有人有讨论使用特定库的可行性的链接,我很想听听。
    【解决方案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 静态链接的插件,是否使用 JUCE 框架(虽然有点贵,但也没有在价格上欺骗其有限的用户群),或者其他什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 2012-05-29
      • 1970-01-01
      • 2011-01-12
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多