【问题标题】:How can I join a QT GUI to a non-C++ main program?如何将 QT GUI 加入非 C++ 主程序?
【发布时间】:2014-11-27 13:06:57
【问题描述】:

QT 似乎是最好的跨平台 GUI 工具包。不幸的是,它是用 C++ 编写的,它与许多有趣的语言(例如 D、Rust、Julia 和 *nix 上的 Mono)的绑定要么不可用,要么不维护。 GTK 绑定通常可用,但 GTK 在 Windows 和(尤其是)OS X 上看起来很难看。wxWidgets 绑定也很好,但对于 D、Rust 和 Julia 不可用或未维护(对于 Julia,我可以通过 Python两个工具包,但速度慢且笨拙)。

如何将我的 C++ GUI 绑定到非 C++ 主程序?

【问题讨论】:

  • 将 Qt 例程包装为 C 函数;大多数语言实现都接受 C 外部函数。你在想什么确切的语言?

标签: c++ qt user-interface mono rust


【解决方案1】:

这里有几个选项。

首先,您可以通过 C API 绑定您的 GUI 和您的主应用程序。 GUI 通常是通过事件循环调用的回调来完成的,因此您必须将高级语言中的函数公开为 C 回调,以便从事件循环中调用它们。然后你需要启动 Qt 事件循环。根据您使用的语言,有多种方法可以做到这一点。例如,如果您使用 Rust,您可以创建一个静态或动态库并将您的 C++ GUI 程序链接到它。在这种情况下,程序的“入口点”将是 C++ 部分。如果您使用 Julia 之类的东西,您可能希望将 C++ 部分编译为一个库,该库还将公开一个调用 Qt 事件循环的函数。所以在这种情况下,“入口点”将是您仍然需要回调到 C++ 库的更高级别的部分。

第二种方法更接近于 Web UI。您可以使您的 GUI 成为用另一种语言编写的主应用程序的客户端。它们可以通过一些现有的协议(例如 HTTP)交换消息,或者您可以通过低级 TCP 或 UDP 连接实现自己的协议,或者您可以使用“中级”消息传递库,例如 ZeroMQnanomsg。您也可以考虑完全放弃 Qt,只编写一个 Web 应用程序,将您的程序用作 Web 服务器。这是现在编写 GUI 的最跨平台的方式,我猜 :)

【讨论】:

  • 如果我想将 UI 视为以后可能会重写的模块化组件(例如原生外观),第二种方法会是最好的吗?
  • @Demetri,我相信是的,因为它比直接 C 绑定更加解耦。
  • 那么在使用所有这些选项时,在以下情况下,速度差异是多少(在将数据从 GUI 传递到后端、后端处理到将结果传递回 GUI 进行渲染方面): 1. GUI 和后端在相同的语言(比如 Qt 和 C++) 2. 不同语言的 GUI 和后端(比如 C++ Qt/Julia) 3. 在浏览器中呈现 GUI 的 Web 应用程序,以程序作为服务器 什么是分析这些选项的好方法?
  • @Asy 你的问题太复杂了,无法在评论中回答,更新答案是不正确的,因为它与原始问题无关。因此,您应该创建一个单独的问题。
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多