C++中的GUI?还是选择C#和Java?哪个更好?

15
我即将完成一门关于使用C++进行面向对象编程的课程,我们在这门课程中编写的所有程序都是控制台应用程序。我还完成了一门大学C编程课程,所以我认为我有扎实的C编程基础,现在是迈向GUI的一个重要步骤。
我做了很多搜索,每次阅读更多页面时我就越来越困惑,我了解到过去有两个著名的选项,即WinAPI和MFC。我试图研究WinAPI,但它似乎相当困难并且需要很多时间,因此我询问了我的导师意见,他告诉我,如果我想编写GUI程序,最好学习C#或Java而不是使用C++,虽然C++更快,但更适用于像驱动程序等低级别编程应用。
因此,我在网上搜索了一下,想知道C++是否仍然用于编写现代应用程序,令我惊讶的是Firefox、Google Chrome、Notepad++和sourceforge.net上的许多其他GUI应用程序都是用C++编写的,与我的导师的建议相矛盾。此外,我了解到可以使用QT或GTK库来构建C++ GUI应用程序,但我不知道该如何操作或者这是否真实可行。
我的问题是,无论学习曲线有多陡峭,现在有哪些最好的可用选项能够高效地编写GUI程序。我搜索了C++ GUI选项,因为我认为速度会比Java或C#应用程序更快,如果有人有不同的意见,请说出来。

在GUI方面,"快速"是指什么? - n0rd
WinAPI,不是API。API是一个通用术语。 - el.pescado - нет войне
我是指WinAPI。感谢您的纠正。 - Ahmed
@n0rd:我所指的速度是指程序的一般响应速度,就像 Firefox 刚发布时比 IE 快得多。 - Ahmed
1
我认为Firefox的响应能力取决于所使用的有效算法,而不是GUI工具包或编程语言。虽然C++更接近底层,通常情况下应该更快,但在C++、Java和C#中实现相同算法时,你不会注意到执行速度上的主要差异。 - n0rd
13个回答

22

首先,如果您想学习编写平台无关GUI界面,则不应选择C#。

在使用C++编写GUI界面时,需要考虑工具包的问题。Qt和GTKmm为您提供了非常出色的跨平台工具包。尽管Qt在Windows上比GTKmm具有更多的“本地”外观和感觉,但Java Swing也可以编写非常好的GUI界面,但它比使用Qt或GTKmm编写的GUI界面更沉重和缓慢。

现在...C#/WPF与Java GUI存在相同的问题-比本地应用程序慢,并且还将使您仅限于一个平台。

我的个人建议是从Qt开始学习。


我从来没有完全弄清楚何时需要购买Qt许可证,何时不需要。我认为当你只开发桌面应用程序时,你可以放心使用,但请不要完全相信我的话。 - Blub
@Blub,最近的Qt版本以LGPL协议发布,因此只要你动态链接,就可以几乎无限制地使用它。 - Artyom
我只是想在此更新一下,因为上次编辑是在2012年; 随着Mono项目的发展,C#开发也变得跨平台了。 来源 - Luc Angevare

6
如果您是GUI编程的新手,C#/ WinForms将是最适合您的选择。它相当简单,拥有一个伟大的社区,有许多可直接使用的控件..并且拥有史上最好的文档 - MSDN。
当然,如果您正在寻找“事情如何工作”的深入了解,则必须了解Win32 GUI。因此,您可以始终返回C ++ / MFC。我不建议任何其他C ++库(如Qt),不是因为它们不好,而是因为它们需要良好的经验才能启动。
我的建议是从WinForms开始,了解基础知识并学习创建简单的应用程序。一旦您在其中成为专家,请深入研究 :)

完全同意你的观点。在编写第一个仅使用Win32 API的C++应用程序之前,我一直在使用.Net表单。那是一个非常痛苦的时期,因为一切都很陌生,难以理解。 - Truong Ha
我还记得当我从Borland C++ Builder转到Visual Studio MFC的时候,那真是太神奇了 :) - Alexander Beletsky

3

JUCE http://www.rawmaterialsoftware.com/ 会为你提供GUI和更多功能,它是C++编写的,非常易学、快速,并且具有很强的跨平台特性(适用于iPhone等设备)。我已经彻底转换过来了。 - learnvst

2

这取决于您想编写什么类型的GUI应用程序。如果您想编写像MS Word或Firefox这样的收缩包应用程序,则应使用C ++,因为市场需要最后一点性能,并且依赖关系最小。另一方面,如果您想编写(例如)与公司数据库交互的接口,则GUI的性能通常不重要,但快速且廉价地提供东西是必要的,因此您应该使用更多类似于C#的RAD工具。


2

Qt非常好用。有人说WTL也不错,但我没用过。

对我来说,Java和GUI的结合并不是很顺畅。虽然Java有一些本地GUI库(如AWT、Swing),但它们速度较慢,而且不能提供其所运行的平台所原生支持的接口。还有SWT,它被Eclipse使用,但我没见过除了Eclipse之外的任何应用程序使用它。

如果GUI需求很简单,我会选择C#:你只需要在窗体上放置一些控件,编写一些逻辑代码,就可以开始工作了。如果需要一个真正复杂的GUI,我认为在不同语言之间开发时间不会有太大的差异。


1
那么Qt只是一个库,可以简化使用C++制作GUI应用程序的过程?你能举个使用Qt的应用程序的例子吗? - Ahmed
不得不承认,Java在构建桌面应用方面并不擅长。如果你想要一个快速开发环境,那就坚持使用C#吧。 - Truong Ha
Qt 不仅仅是关于 GUI 的。它是一个框架,允许制作跨平台应用程序(它有很多与 GUI 无关的实用类)。例如:Qt Creator - 用于 Qt 开发的 IDE 是使用 Qt 编写的。 - n0rd
SWT非常不错,可能是一个很好的起点。正如Eclipse所展示的那样,你可以在那里创建惊人的GUI界面。 - atamanroman

2
最快的方法是使用C#和WPF。对于小型应用程序来说,它又快又简单,但在我看来可能相当复杂,并且有很多需要学习的内容。至少你是未来可持续发展的,微软最终正在推动WPF。(Visual Studio使用它,并且将会有更多的版本面世) 唯一的真正缺点是,你只能在Windows中运行应用程序。
如果你真的想要“低级别”访问权限,那么有很多与C++代码的Interop选项。

C#和WPF的性能是否与C++和MFC相当?只要你说它们难学,那我为什么不学习更快的呢。 - Ahmed
1
这里所说的“最快速的方法”仅指开发应用程序的时间。我相信这些应用程序可以像使用C++和WinAPI编写的应用程序一样利用计算机资源并运行得很快。这就是为什么Firefox、Chrome和许多其他知名应用程序仍在使用C++的原因。 - Truong Ha
这没有意义。你说C#在开发速度上更快,程序响应和效率与C++和WinAPI一样快,但人们使用C++。 - Ahmed
这对我的需求听起来不错,尽管Qt被评为更好的答案,但我想在我目前的知识水平上,应该从更容易的方式开始学习GUI,也就是C#,当我掌握了几种语言的更高级别时,再去学习Qt和MFC会更容易。谢谢Bulb。 - Ahmed
3
最快的方法是使用C#和WPF。 - Artyom
显示剩余5条评论

1

这并不是对你问题的确切回答,但如果你还在学习阶段而不是在生产线上,可以尝试学习Win API。实际上,我很惊讶没有人告诉过你。

你看,所有其他框架/API/SDK实际上都只是围绕着这个API的包装器,而且很有可能每当你被要求在GUI中做一些非标准的事情时,你都找不到解决方案在你的框架内,需要深入了解Win API。

是的,它是仅限于Windows的API,但了解幕后发生的事情可能在某些时候非常方便。

仅供参考。


1

C++ 适用于速度较快的应用(如 Chrome / Firefox 等 HTML 渲染工具或像 Photoshop 这样的图像编辑器),并且可以执行其他平台上无法完成的“壮举”。

但是,使用起来更加繁琐,任何基于 C++ 的 UI 库都需要比您想要学习的更多的学习曲线。

由于您的问题明确表明您不需要这些功能,因此您的默认选择应该是 C#、Java 或 Web 基础,就像您的导师建议的那样。


我有点不同意。Qt(例如)非常好文档化,自从一年前开始使用它以来,我只遇到了一些小问题。对于初学者来说,真正的挑战将是语言,而不是框架。另一方面,C#是一种稍微简单一些的语言,但我发现MSDN文档不够严谨,难以学习。 - San Jacinto
QT可能是一个特殊情况 - 我不知道,因为我没有使用过。但为什么要费心处理C++和内存管理,显然用户只需要一些工具来构建UI。OP甚至没有特定的UI用例,更不用说特定的C++用例了。 - computinglife
@computinglife Qt的内存管理模型非常不错。如果您从框架中的对象继承并将其父对象设置为框架中的另一个对象,则很少需要自己管理内存。对于您需要管理内存的情况,有智能指针类可用。使用Qt的非常好的理由和不使用Qt的非常好的理由都存在。我只是想说,尽管语言不同,但它是一个很棒的框架。 - San Jacinto

1

C++永不消逝,因此学习它并不是一个错误的决定。然而,在早期使用C++编写GUI应用程序相当困难。因此,在回到C++之前,我建议您使用C#编写一些GUI应用程序。


0
如果你决定使用C++,可以看看wxWidgets - 这样你就不会局限于一个操作系统(在这种情况下是Windows和MFC)。QT也应该不错,但我从未尝试过(我对wxWidgets的经验也不多,但我做过几次与它们有关的事情,效果还不错)。
如果你不需要GUI高性能,可以看看脚本语言 - Python有一个默认库(tkinter)可以很好地工作,并且还可以绑定到wxWidgets。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接