在使用C++编写GUI应用程序时,最好使用哪个库?

12

可能重复:
Gui 工具包,我该使用哪一个?

我有相当多的 C/C++ 经验 - 主要是为 Windows/Linux 编写控制台应用程序,以及相当多的 C# 经验 - 通常是为编写 WinForms 应用程序等。

我非常 impressed,可以在 .net 中轻松创建窗口,例如像这样简单的东西:

Form form = new Form();
form.ShowDialog();

只需这么做就可以在屏幕上显示一个空表格。实际上,

new Form().ShowDialog();

只要我们不介意关闭表单后失去对它的引用,那么技术上来说这已经足够了。

我尝试使用 windows.h 写一些基于 Windows 的 GUI 程序,但是学习曲线似乎有点陡峭而且语法非常冗长。使用 windows.h 创建一个简单的窗口就可以超过两打行。

并且,如果我想将应用程序移植到 Linux/Max(我几乎无法使用 .net 做到这一点,除了像 mono 等 hack 方法),那么我需要重写 95% 的 GUI 代码。

我假设这就是框架的作用所在,例如 QT 等……(我对 GUI 框架不是很了解,恐怕)。

你推荐哪些 GUI 框架?哪些最强大,哪些最容易使用?你通常如何处理使用 C/C++ 编写 GUI 的任务?


如果你稍微浏览一下网站,就会发现这个主要问题已经被讨论得够死了,而最后一个问题则非常开放性。 - San Jacinto
意识到 Windows API 不是 GUI 工具包,而是应用程序与操作系统交互的低级接口。当然,对于任何非平凡的东西,您都需要使用框架。您是正确的,这就是框架发挥作用的地方。 - In silico
我不认为Mono是一个“hack”。 - Earlz
另外,需要注意的是C/C++比C#低级得多。这意味着,无论使用什么GUI框架,它都会更冗长。 - Earlz
2个回答

5
越接近底层编程,事情就越困难。.NET Framework提供的WinForms是对Win32 API的非常出色的抽象,考虑到即使是最简单的任务(如让窗口显示在屏幕上)所涉及的复杂性,你已经看到了它的背景中仍然发生了所有这些事情(注册窗口类、创建窗口等),只是你不必自己编写代码。
有趣的是,你认为Mono是一个“hack”,但会考虑像Qt这样的库。我真的不确定你根据什么基础做出区分。当涉及到WinForms支持时,Mono库被广泛认为是优秀的。最大的批评者与微软自己的CLR实现相同,即它不会生成真正的本地代码,在大多数情况下,这比人们想象的更无关紧要。除此之外,一些人抱怨说,Mono应用程序没有完全遵循平台的UI指南(也就是说,它们的外观和行为并不完全像本地应用程序那样),但我对使用Qt编写的应用程序也有类似的抱怨。
如果你想在C++中进行GUI工作,似乎每个人都推荐使用Qt。正如我上面提到的,它不是我的最爱库,因为我坚持使用当前运行平台提供的完全本地控件和小部件。我知道Qt最近在这方面有所改善,但我仍然认为它不符合我的标准。如果你比我更灵活(我会警告你,普通的Mac用户并不比我更灵活),真正的平台独立性对你来说是一个大问题,那么它可能是你应该选择的库。许多人赞扬它的设计优雅和方便性,尽管我严重怀疑它甚至能够提供与.NET Framework实现相同的简单性。
如果像你的问题开头所表述的那样,代码的简洁性和简洁性非常重要,我强烈建议坚持使用C#和WinForms。随着你开始删除抽象层,事情变得越来越困难,如果你不需要所提供的额外控制级别,那么几乎没有理由为自己增加更多工作量。假设你的需求相对较为简单,Mono的Forms实现是跨平台应用程序的完全可行解决方案。
除此之外,如果您想以正确的方式在C++中创建真正跨平台的应用程序,我建议您严格将数据层代码与UI层代码分开,并使用每个平台提供的工具编写UI。在Windows上,您有相对较多的选择:.NET WinForms是一个不错的选择,本地Win32虽然有些痛苦但也是一个值得考虑的选项,而像MFC和WxWidgets这样的一些其他库可以帮助您缓解完全本地编程所带来的痛苦(尽管远不如WinForms那么好用)。在Mac上,唯一的选择是Xcode、Interface Builder和Objective-C,目标是Cocoa框架。基于Linux / Unix的系统并不是我的强项,但我了解到Qt是一个非常本地的库。虽然听起来比实际操作要复杂,但是一个设计良好的库应该处理80%的工作,只留下约20%需要您实现UI。除了使用真正的本地控件和小部件之外,我认为这种方法提供的另一个重要优势是灵活性。请注意,Microsoft Word在Windows上看起来与Mac上的样子截然不同(尽管有些表面上的相似之处)。iTunes已经成为Mac平台上出色的UI设计的典范,但在Windows上却像一个瘦骨嶙峋的怪物。另一方面,如果您在Mac上推出类似于Windows Media Player这样的应用程序(是的,Microsoft自己尝试过,但没有取得太多成功),Mac用户将把它视为一个完全的悲剧,并可能对您甚至尝试了解这款应用程序而感到有些冒犯。对于真正跨平台的开发人员来说,情况并不理想。总之,如果您的应用程序不仅仅是最简单的实用程序,您可能会发现在每个要支持的平台上,一个完全不同的界面都是合理的(甚至是预期的)。
无论Qt有多么强大,也无法达到以上目标。

感谢您提供精彩而详细的答案!我很感激您对不同平台之间被接受的设计趋势的洞察力 - 这是我没有考虑到的。我想我称mono为“hack”的原因,在回顾时有点过于强烈,是因为它不受Microsoft支持,并且在我的经验中,更复杂的.Net类并没有按预期工作,例如Sockets等。 - Ozzah
@Ozzah:微软不支持很多东西,主要是因为它们不是由微软创建的。他们肯定没有努力去阻止Mono项目,事实上,他们一直以来都非常支持。虽然微软自己的CLR是专有软件,但.NET语言(如C#)基于开放标准,并鼓励社区参与。微软甚至将.NET推广为平台无关的产品,这只能通过像Mono这样的项目的贡献者的努力才能实现。他们的实现中有一些漏洞,但并不多。 - Cody Gray
@Ozzah:你可以在这里找到更完整的兼容性列表(http://www.mono-project.com/Compatibility),但据我所知,最大的缺陷是缺乏WPF支持。几乎所有WinForms应用程序所需的一切都已经存在并且运行良好。至于未考虑不同平台之间的设计趋势而导致失败,不要太难过。大多数人*不*考虑这些事情,这可能是我的一个论点。我是一位Mac用户,有自己的风格和美学,但是我必须在Windows上开发,因此我被困在那个平台上,有时候它对UI的关注不足。 - Cody Gray
警告:远离Mono的Windows Forms实现!开发人员表示它不再被开发,因此他们不会修复任何错误。根据我的经验,在Mac OS X上完全无法使用(例如,应用程序中的控件没有被绘制,用户按键的顺序处理错误)。它在Linux上可用,但有时用户报告来自它的分段错误。 - David Grayson

3

毫无疑问,Qt是最完整、最成熟、最快速的框架。此外,它还是一个严重的多平台选择,您可以选择商业友好的开源或付费支持。


4
你知道,我每天都使用Qt,我喜欢它的很多原因。然而,这是一个无用的回答。你提出了许多主观的赞美之词,但没有提到缺点。你也没有提到由于诺基亚的商业决策导致的Qt不稳定的最近问题。简而言之,这不是我从一个拥有17K声望值的SO成员所期望的回答类型。 - San Jacinto
“主观的”?这些都是简单的形容词,但可以客观验证。我经常发现提到的陷阱更加主观,比如“它不是真正的C ++”,或者“手动内存分配很难”。诺基亚目前的管理不善只影响移动平台上的流行度,而不影响在桌面上的可行性。 - Javier
2
"最全面的?""最成熟的?"这是客观可验证的吗?按照谁的标准和应用程序来验证呢?但无论如何,通过您的答案_验证_它们。链接到相关内容。展示数据。这就是我的观点。否则,这些只是主观的“我的框架比你的好”的说法,SO上的噪音数据比继续增长。此外,我想补充说使用该框架存在_真正的_缺陷,并且这并不意味着它是臭气熏天的一堆东西。这完全取决于我们Qt开发人员愿意做出的权衡。 - San Jacinto

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