25

我目前有一个需要与 GUI 连接的 C++ 后端,而且由于我以前从未构建过 GUI,所以我对从哪里开始感到困惑。

我很喜欢用 C++ 和 Java 编写代码,所以我希望我的 GUI 使用其中一种语言。此外,GUI 必须在 Windows 和 Linux 上合理地独立于操作系统(希望如此,因此是 Mac)。

现在我明白了,如果我使用 Java 来做这件事,我需要一些包装器来做——但我也听说过(严格来说是二手的)用 C++ 编写 GUI 是一种痛苦。

我不想用 Java 重写太多后端代码(谁来做??),我希望输入以下内容:

  • 与另一种语言相比,这两种语言是否具有严重的优势/劣势?
  • 包装问题有多严重,如果我使用 Java 会进行多少重写。
  • 是否有任何我应该查看人们认为相关的特定资源?

谢谢大家,干杯:)

4

11 回答 11

34

看看Qt

根据我的经验,在两种不同的语言运行时之间进行交流总是具有挑战性的。如果您有一个重要的应用程序来构建以下内容,通常会带来挑战:-

  • 错误处理。
  • 内存管理。
  • 多线程和同步语义。

除了由于包装器而增加了一层间接性之外,它还需要大量思考,例如需要在 GUI 和后端等之间传递数据结构的情况。

例如:- 考虑将 JavaString从 GUI 传递到后端 C++。本质上,我们必须从 JavaString对象中提取字符,并让 C++ 开发人员可以使用它们,而不会泄漏保存它们的内存。这是一个基本问题的示例(还有其他方面,例如要返回字符的编码)。

于 2010-07-08T19:26:54.020 回答
15

您说您已经了解 C++ 和 Java,并且您以前从未做过 GUI。这意味着:

  • 无论您选择 Java GUI 还是 C++ GUI,您都需要学习如何处理 GUI 框架
  • 如果你选择了Java,你还需要学习如何在两种语言之间进行交互

因此,留在 C++ 中可以为您节省一件事来学习。嗯,学习一些东西总是一个好主意,但同时学习两个新概念可能是个坏主意。无论如何,学习可能是较小的负担,我想这涉及到很多实际工作,即使您使用 SWIG 之类的工具也是如此。

您可能想知道用 Java 编写 GUI 还是用 C++ 编写 GUI 更容易。这取决于选择的框架。对于 Java,您有 AWT 和 Swing,它们是默认 Java 发行版的一部分,然后是 Eclipse 使用的 SWT,例如。对于 C++,有很多工具包,其中 Qt、GTK 和 wxWidgets 是最流行的,这三个工具包都支持每个主要平台。这些“C++”GUI 工具包中的大多数还具有Java 绑定甚至Java 端口,因此您也可以将它们与Java 一起使用。

到目前为止,我已经使用了 Swing、Qt 和其他一些对您的情况没有帮助的东西(Borland C++ Builder 和 .NET 上的 WinForms 附带的 UI 东西)。基本上,所有这些框架的概念都是相同的,我发现没有一个比另一个更难或更容易。唯一的例外可能是 Java,因为我从来没有让那些 LayoutManagers 工作,即使其他工具包具有易于掌握的 LayoutManagers 等价物。但也许那只是我。

人们还会告诉您,Java GUI 总是很丑陋并且不适合主机系统。好吧,大多数 Java GUI 确实如此,但恕我直言,这不是因为 Java,而是因为糟糕的编程。让 Swing 应用程序适应操作系统的外观和感觉需要两行代码,而大多数程序员根本没有在 Java GUI 上投入足够的精力来复制和粘贴这两行代码……你可以想象有多少他们关心其余的 GUI 设计。

对于你目前的情况,我会推荐一个 C++ GUI,但是如果你知道你未来的计划是什么样的,并且如果你知道你将在你的余生中使用 Java GUI,那么现在开始并采取的额外努力。

如果你为 GUI 选择了 C++,人们会告诉你各种各样的东西来把你拉向任何方向。三大可移植框架都有其优点和缺点,但我不认为其中有任何一个最好或最差的。我推荐 Qt 仅仅是因为我已经使用过它——但如果我碰巧使用了 GTK 或 wxWidgets,我可能会建议这样做。

于 2010-07-08T21:59:45.067 回答
9

根据您的需要,当您没有现有的前端代码时,简单的 Web 界面可能是最简单的。在您的应用程序中嵌入一个小型 Web 服务器并在“ http://localhost:12345 ”(或您最终使用的端口)上打开浏览器。

于 2010-07-08T20:55:56.717 回答
4

关于耦合 Java 和 C++ 我不能说太多,但我建议你看看Qt。它是一个用于很多事情的 C++ 库,比如文件和网络访问,但它以 GUI 开发而闻名。它还有一个不错的 IDE,您可以通过拖放构建您的 GUI。我还要说 Qt 与 GUI 库一样与操作系统无关。

于 2010-07-08T19:31:18.183 回答
2

用 C++ 编写 GUI 并不比用 Java 编写更痛苦。

有许多跨平台的 GUI 库。GTK、gtk--、FoX、WX 等。我不推荐 Qt,因为它不是真正的 C++(使用该语言的扩展版本,在编译之前需要一个特殊的预处理器)。另外,如果您不想放弃您的产品,这将花费一大笔钱。

顺便说一句,这不是“因此”这个词的使用方式。

于 2010-07-08T19:31:48.963 回答
1

日蚀呢?看起来不错,在所有平台上都表现良好。我的猜测是大部分 Eclipse 是 Java。

于 2012-06-28T07:24:22.157 回答
1

您没有提到前端和后端之间交互的丰富性,这将衡量现有语言在您的决策中的重要性。

我使用过 Qt、Swing 和 SWT,并且通常将 C++ 和 Java 代码与所有这些工具包一起使用。语言之间的交互会增加额外的成本/风险。但是,有时考虑到其他好处,该成本是有道理的。

如果出于任何原因选择 Java 前端,请查看JNASWIG

于 2010-07-08T23:00:18.407 回答
1

让我们在这里说实话。当涉及到可移植的 GUI 时,C++ 并没有出现在地图上。

Java 有一个一致的、可移植的、广泛使用的、完整文档化的、成熟的 GUI 工具包。C++ 有一堆半途而废的 OSS 库,几乎没有工作,没有一个是真正可移植的,还有一些昂贵的商业库,它们不能在他们声称的所有目标上工作,在剩余的目标上工作参差不齐,并且反转控制,这样你就可以卡在他们奇怪的框架中。

除非您出于其他原因(其中有很多)需要 C++,否则请为 GUI 选择 Java。交叉编码对于了解两种语言的人来说是微不足道的,但管理起来可能会很混乱,因此您需要尽可能地最小化本机界面。我的建议是与您的团队达成协议,您将永远不会尝试在界面上保存指针(或引用)。如果你这样做,它只会变得更加混乱,而且当线路缠结时,没有调试器可以拯救你。相反,使用整数或字符串键并通过本机接口传递它们。

于 2010-07-08T23:05:14.983 回答
0

为什么你不学习像 WINAPI 或 X11 这样的原生 C++ GUI?然后,您可以使控制台软件与其中之一兼容,例如 winehq、cygwin 或其他开源兼容性或仿真软件,因为您从未在 C++ 上开发过 GUI。不要选择 Java,因为它使用更多的 RAM。当然,除非你有很多内存。例如,Eclipse(用 Java 编码)在没有打开项目的情况下运行时可以使用 500mb 的 RAM。

于 2017-01-23T07:54:13.783 回答
-1
  1. 包装不是重写,它只是使两种语言相遇的适配器。这是直截了当的
  2. 由于您似乎没有固定在一种语言上,我会选择一个 .NET Gui(使用 C++ CLR),您将拥有一个独立于机器的 GUI,并且您可以轻松地与现有代码进行通信。

对于初学者来说,WinForms 可能更容易,但尝试使用 WPF,它是 .NET 世界中用于 GUI 开发的最现代的变体。

我个人会使用 C#/.NET 作为 GUI 并使用 C++ CLR 包装 DLL。但这不是唯一的解决方案。

在 Linux 下,最好的 .NET 实现是MONO。对于我开发的所有 WinForms 应用程序(它们不是最疯狂的),它们运行时没有变化。使用 C++/Qt,您必须为每个目标操作系统重新编译。

于 2010-07-08T19:32:05.093 回答
-1

除非平台独立是必须的,否则不要使用 Java 创建 GUI。用户体验会很慢,与 C++ 的互操作性会很痛苦。

要在 C++ 中创建本机 GUI,您可以使用GTKmm以及 Boost 或 QT 等库。此外,这些库可用于大多数平台(GNU/Linux、Windows、OS X),因此您的应用程序可以在任何地方重新编译。

编辑:使用GLADE快速创建 GUI 并用 GTKmm 中的 C++ 代码填充信号槽。

于 2010-07-08T20:20:20.510 回答