使用复杂的 GUI 编写跨平台应用程序

Posted

技术标签:

【中文标题】使用复杂的 GUI 编写跨平台应用程序【英文标题】:Writing cross-platform application with a complex GUI 【发布时间】:2010-07-10 10:50:26 【问题描述】:

我想开发一个具有复杂 GUI 的应用程序(带有动画的组合框、带有样条的图表、透明层……)。我在 C# 2.0 方面有很好的经验,我正在研究 WPF,但我读到了,不幸的是,没有将 WPF 移植到 Mono 的计划。

如果我坚持使用 C# 并使用 OpenGL(通过 OpenTK) 创建自定义 GUI 控件,我觉得这将是一项艰巨的工作(与GTK#,调试,难以用于设计表单)。

我可以使用 Java(带 JOGL),但我不是很熟练,也不知道性能问题。

最后一个选项是 C++,但我必须做一个大的revision(距离我上次使用它已有好几年了),我发现开发起来很困难C++ 中的 GUI 和可移植应用程序。 (也许我错了!不过,我还是很害怕用这种语言开发如此复杂的应用程序。)

你有什么建议?我最好选择 C# + OpenTK、Java + JOGL,还是回到 C++?

【问题讨论】:

您的要求是否说明您需要为多个平台进行开发? Gtk# 在 Mono 和 MS 的生态系统中都可用 - 有什么问题吗? 更简单(原文如此)和最强大的选择是使用 Qt。 【参考方案1】:

我会选择 Qt。看看http://qt.nokia.com/products/。如果你害怕 C++(但没有理由害怕它),你可以试试 Java Swing。我认为这些是多平台桌面 GUI 开发的最佳选择。

【讨论】:

我想开发新的自定义控件,例如:dev.blender.ir/images/…,我需要一个复杂的时间线/轨道控件,例如:synthtopia.com/content/wp-content/uploads/2007/06/… Swing 或 Qt 可以帮助我吗? Qt 允许 - 鼓励 - 开发人员将他们的框架子类化为自定义控件(“小部件”),并拥有一个强大的图形操作库,您可以轻松地将其绑定到您的控件中。 Qt 还利用了平台的优势,例如抽屉、工作表以及将文件与 Mac OS X 中的窗口相关联。 @Kill KRT。这些控件看起来相当复杂,在任何框架中开发它们都不是一件容易的事。但是让它们跨平台的最好方法是使用 Qt。 其实像Kill KRT这样链接的控件在WPF/Silverlight中很容易开发。它们只是很难在 Qt 中开发,因为 Qt 本身非常原始(没有 DataTemplates、有限的渲染模型等)。 Silverlight 是跨平台桌面 GUI 开发的绝佳选择。所以就 Kill KRT 而言,我认为 Silverlight 显然是比 Qt 更好的选择。【参考方案2】:

我建议使用 Mono 和 GTK#。使用 .Net 开发应用程序比使用 C++ vanilla 更有效。当然,您必须坚持使用 C# 3.0 和 .Net 2.0(实现了 3.5 中的一些功能,例如 LINQ)。但它仍然为您提供了比 C++(例如 QT)更多的功能。

【讨论】:

我知道...我也发现 C# 比 C++ 更高效,但是当我尝试创建一个 exotic 自定义控件(如带有动画图标的树视图)时,我发现很多性能问题,GDI+有限。所以我正在寻找一个让事情变得更简单和更快的库/框架。 GTK# 是这样吗?还是我最好选择 C++ 和 QT? @Kill KRT:GTK 有很多 Qt 共享的灵活性,因为这两个工具包都来自一个真正没有本机小部件库的环境。然而,Qt 在很多方面都比 GTK 更容易扩展。 我在使用 GDI+ 时没有遇到任何性能问题。如果您要使用动画图标或类似的东西,则需要双缓冲。然后它会像婴儿一样顺利;)【参考方案3】:

使用 C# 提高生产力。没有反对 C++,但它有点冗长。 至于 GUI 库,我认为 WinForms 曾经在 Mono 上工作。或者,GTK#。

【讨论】:

【参考方案4】:

我不建议使用 wpf,因为它是一个依赖于平台的平台。 Silverlight 可能是一个更好的选择。

但是,如果您正在开发 Web 应用程序,jquery 将是一个不错的选择,您也可以考虑使用 adobe flex 和 adobe air; http://www.adobe.com/products/air/

【讨论】:

不,我不是在开发 Web 应用程序,但感谢您的建议。我去看看 Air(它的名字听起来不错 ;-)) Adobe AIR 放弃了对 Linux 的支持,Microsoft Silverlight 现在基本上已经死了。 Adobe Flex 变成了Apache Flex。【参考方案5】:

多平台是否必须包含 iDevices?可以在网络上吗?这是你必须首先回答的 2 个问题。

如果您可以在没有 iPad/iPhone 支持的情况下生活,那么 Flex/Flash/Air 是高度图形化事物的不错选择。它肯定是多平台的,并且很容易集成到网络中。由于给出的细节有限,这可能是您在这种情况下的最佳选择。

Qt 也可以为您工作,尽管我不能确定它的图形库是否会使其变得容易。我个人从未使用过它,所以其他人必须回答这个问题。但由于它是在 C++ 中的,因此您也可以使用其他库。

对于这种复杂的 GUI,Java Swing 对我来说听起来很粗糙。做一些基本的东西还不错,但如果你期待像 C# 这样的体验,我想你会感到沮丧。当然只是个人意见。

最后,如果它可以是一个 Web 应用程序,为什么不坚持使用 C# 和 Silverlight? .NET 解决方案可能对您很有效,因为您已经在学习它。

【讨论】:

它不是一个 Web 应用程序,而且我不认为要与任何 iDevices 兼容......我想我会回到我的 Stephen Prata 的书并尝试 Qt! ;-) 什么? Silverlight 不仅适用于 Web 应用程序。 Silverlight 也是桌面应用程序的绝佳平台。 Silverlight 应用程序可以在所有主要操作系统的浏览器中运行。您的回答似乎暗示 Silverlight 仅限于 Web 应用程序。也许您应该对其进行编辑,以明确指出 Silverlight 对于桌面应用程序也是一个不错的选择。 即使在我自己反对 Silverlight 的建议中,我唯一的问题是渗透。如果他真的想要跨平台,那么如果他想吸引“普通”观众,他就会错失良机。根据 riastats,只有大约一半的 OSX 用户安装了它。昨天我问了 5 位 Mac 朋友,其中 0 位安装了它,甚至知道它是什么。同样的事情也适用于 Windows 7 或 Windows XP。我想这也取决于目标受众。与往常一样,我们可能需要更多信息。我并不是有意怀疑 Silverlight 的能力。 也许我错了,但据我所知 Silverlight 仅在 Windows 和 Mac 上可用,在 Linux 上有一个“移植”(Moonlight)。我可以在 Silverlight 中开发一个应用程序并轻松移植到 Moonlight 吗?我也知道 Moonlinght 并没有完全涵盖所有 Silverlight 功能。最好的事情是在 Mac 和 Linux 上提供 WPF 框架! @Awaken:是的,Silverlight 今天的渗透率只有 62%,但你知道一年前是 30% 左右吗?按照 Silverlight 的发展速度,它将在 2011 年底轻松赶上 Flash。另外请注意,Silverlight 的安装比 Flash 更快、更干净(没有烦人的额外步骤),可以想象你的一些 OSX 朋友安装了它,但没有意识到。但这一切都不重要,因为 Kill KRT 正在开发一个 桌面 应用程序 - 他可以简单地将 Silverlight 作为安装包的一部分并完成它。【参考方案6】:

Silverlight 在 Windows/Mac/Linux 和一些手持设备上运行,并且正在移植到更多手持设备。我相信 Silverlight 最终会被移植到所有流行的设备上。

银光是:

    比 Flex/Flash/Air 强大得多。 比 Qt 强大得多。 比 GTK+ 或 GTK# 强大得多。 比 JOGL 强大得多。

Silverlight 具有您要求的所有功能。

Silverlight 与 C# 配合得非常好,C# 是一种比 C++ 更高效的语言。

Silverlight 基本上是 WPF 的一个非常大的子集,所以如果您已经了解 WPF,那么您就已经了解 Silverlight。

除非你绝对需要 iPhone/iPad 支持,否则我认为这个决定是显而易见的。

请参阅this comparison of WPF and Cocoa 以了解 WPF/Silverlight 与 Qt、Flash/Flex/Air 和 GTK# 之类的比较,所有这些都使用类似于 WinForms 的原始对象模型可可。

【讨论】:

我不知道 Silverlight 也可以用来开发“桌面”应用程序。我的疑问是: - 性能(QT 与 Siverlight) - 可移植性(Moonlight 并未完全实现所有 Siverlight 功能) - Silverlight 与 WPF 有什么关系?我可以学习 WPF,然后轻松“切换”到 Silverlight 吗? Silverlight 最初被称为“WPF/e”,表示“WPF Embedded”,是 WPF 的简化版本。最初它比 WPF 简单得多,但现在差距已大大缩小。第一个版本是纯网络版,但后来的版本允许 Silverlight 作为桌面应用程序运行。 Moonlight 实际上实现了每个 Silverlight 版本的 100%,并通过了 Microsoft 提供的 Silverlight 测试套件。 Moonlight 大约落后了 1 年,因此对于 Linux 的可移植性,通常只保留一个版本。 学习 WPF 然后切换到 Silverlight 是一种极好的方法:许多人都非常成功地做到了这一点。在这里和那里你会发现缺少的东西,但所有的基本原理都是一样的。事实上,如果您不使用任何 WPF-only 功能,您的 WPF 应用程序实际上将在 Silverlight 中编译和运行而无需更改。不要花太多时间学习 FlowDocument 或 3D,因为它们尚未包含在 Silverlight 中,但几乎所有其他内容都包含。 在大多数情况下,Qt 和 Silverlight 的性能相当。对于复杂的图形和动画,Silverlight 的显示将明显更快、更流畅。对于同时可见一万个小部件的窗口,Qt 的初始化速度会更快。除此之外,您不会看到两者之间有太大区别。【参考方案7】:

在我的日常工作(一家著名的微处理器公司)中,我们使用 Java、Eclipse RCP 和 Java OpenGL 开发复杂的工程应用程序。性能很好——我们可以轻松获得数百万个多边形/秒和高达 100 帧/秒。 Eclipse 中的 SWT 小部件足够快,我们无需使用 JOGL 呈现任何自定义控件。

我有一组教程展示了如何开始使用这种编程。系列以http://wadeawalker.wordpress.com/2010/10/09/tutorial-a-cross-platform-workbench-program-using-java-opengl-and-eclipse/开头。

【讨论】:

【参考方案8】:

首先,不要将 C# 用于任何应该可移植的东西。对于 GUI,Mono 是一个糟糕的选择,原因有两个:

    Mono 总是落后于 .NET。 Mono 不支持 WPF,因此开发 GUI 的唯一方法是使用 GTK# 之类的东西。

我的个人意见 - 使用 C++。它会给你很好的便携性和独立性。

你有两个选择:

Qt4 - 非常好的 GUI 工具包,使 GUI 开发变得非常容易,并且高度可移植。 GTKmm – 也是非常好的工具包,但在 Windows 上感觉不太自然。

此外,Java 有随 JDK 一起提供的 Swing 工具包,可在所有 Java 平台上使用,甚至像 OpenVMS 这样非常奇怪的平台。

【讨论】:

有 Java Swing 性能问题吗?我应该使用 Java+OpenGL (JOGL) 来更快地渲染我的复杂控件吗?我想知道如何实现复杂的 GUI(如 Maya、Cubase、Adobe Premiere)! @Kill KRT - 如果性能对您很重要,请使用带有 Qt 或 GTK 的 C++,不要使用 Java 或 C# 等语言,因为它们的性能很差。 赞成。似乎许多 Java 和 C# 粉丝不喜欢听到他们不是跨平台的(Java 仅针对 Java 平台 - 即使使用 SWT)和用于 GUI 的 Mono,我同意这是一个笑话。我自己正在努力,用我自己的抽象层在本地平台工具包 Cocoa/MFC/GTK 中编写我所有的东西。

以上是关于使用复杂的 GUI 编写跨平台应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Python - GUI

用于调试消息 C++ 的跨平台 GUI 应用程序控制台

如何在 WPF C# GUI 中使用跨平台 C++

认识PyQt5

认识PyQt5

010_初探 Qt 中的消息处理