哪一个框架能够实现Windows原生外观:GTK+、wxWidgets、Qt或FLTK?

37

我需要编写一个应用程序,它在视觉上与原生的 Windows XP/Vista/7 写的应用程序无异,使用最现代的 Visual Studio 默认提供的内容。但是我使用 MinGW 和 Vim(用 C++ 编写)进行开发。

特别地,我希望以下控件在上述三个 Windows 版本中是本地化的:窗体装饰、按钮、复选框、菜单、组合框、进度条、滚动条、富文本框。这对我来说已经足够了。

我知道如果按需加载 GdiPlus 和其他东西,像riched32.dll,并使用 Windows API 实例化控件,则操作系统将替换其版本的 GdiPlus 或其他库,因此它将看起来像 XP 样式的控件在 XP 上,Vista 样式的控件在 Vista 上等等。

但是我不想使用纯粹的 Windows API,因为即使检索默认字体也需要半页代码,而且无论我要做什么,类似的故事都会发生。所以我想使用工具包。

wxWidgets、Qt、GTK+、FLTK 似乎是最广泛使用的。但它们都是跨平台的。我已经使用过跨平台应用程序,其中许多具有外国 GUI 控件(我称它们为小部件)。因此我的问题是:哪个工具包可以制作出真正本地化的 UI 控件,以正确显示在上述三个 MSWin 版本中列出的控件?

我在 Google 图像搜索中输入了每个工具包和" windows",但很难判断,除了 FLTK 可能做不到。你们中的许多人都必须心中有数...


11
wxWidgets 使用本地的 GUI 控件。 - cdoubleplusgood
6
Qt也使用本机GUI控件。 - g19fanatic
17
Qt使用本机的图形API来渲染本机外观的接口元素等,但它仍然不会实际使用本机控件本身。这意味着它们确保了本机外观,而不是行为。 - waldyrious
3
有人能否提供使用GTK、wxWidgets、FLTK、QT或Ultimate++的知名应用程序清单?可以比较它们的外观。 - skan
1
@skan 你可以在这里查看使用xwidgets的应用程序:https://en.wikipedia.org/wiki/Category:Software_that_uses_wxWidgets - 71GA
4个回答

32

我不了解FLTK,因此不会谈论它。

  • wxWidgets使用平台的本地工具包(Linux上使用GTK,Windows上使用Win32 GUI API,MacOS X上使用Cocoa)。
  • GTK使用主题API伪造平台的外观和感觉(在GTK2上使用自定义主题引擎,在GTK3上使用基于CSS的引擎)。
  • Qt使用样式来伪造平台的外观和感觉。

根据我的经验,wxWidgets API相当丑陋,因为它有太多方法只适用于其中一个平台,使得东西不可移植,除非你绕过这些问题。与GTK+和Qt不同的是,它还在所使用的工具包之上添加了自己的错误层。但是,它尽力让应用程序具有原生工具包的外观。

GTK+ 3在Windows上仍有一些粗糙的边缘,自GTK+ 3.6以来正式支持Windows。GTK+项目委托给MSYS2项目分发Windows二进制文件。由于您已经在使用MinGW,因此这几乎是相同类型的环境。它们与GTKmm具有良好的C++绑定。但是,您可能需要一些工作才能为Windows版本正确设置主题。

Qt是跨平台C++开发的良好选择,主要目标是Windows,它尝试模仿平台的原生外观和感觉,但也有自己的主题限制。

总之,只有两种方法:

  • 提供自己的小部件并尝试通过提供主题来看起来像本地平台的工具包(GTK+和Qt)
  • 使用本地小部件,但在抽象层后隐藏其API的工具包(wxWidgets)

它们都有优缺点。


1
我最初想使用wxWidgets,因为虚拟方法通常会微妙地出错,这会让用户感到不舒服。而且,它也不具备未来的可扩展性;考虑到可插拔的主题,你不能将它们全部虚拟化。但是,这个回答https://dev59.com/gW855IYBdhLWcg3w_5cQ#5800101让我相信我必须坚持使用纯WinAPI,因为我的应用程序在启动延迟方面必须快速。我已经搜索了足够多的资料来确认没有一个轻量级库可以为WinAPI提供常识默认初始化和宏,所以我必须自己做。 - Evgeni Sergeev
6
当wxWidgets使用本地UI时,为什么会被认为“相当丑陋”?使用wx开发的应用程序与使用平台标准工具包开发的应用程序无法区分。 - NuSkooler
13
我在谈论的是 wxWidgets API,而不是外观和感觉。 - liberforce
3
@Evgeni: WinAPI的加载速度很快,因为它是本地的。但这是一个糟糕的选择,难以维护,而且它比更先进的工具包需要多出3倍或更多的代码才能完成同样的工作。启动时间并不是生活中唯一重要的事情。 - liberforce
不幸的是,wxWidgets看起来并不好,像rebar/toolbars和ribbons这样的类没有使用本地控件。我刚刚检查了3.0版本,很快就决定放弃了。而且,像MFC Featurepack那样拥有视觉效果(Office蓝色)是不可能的。 - Lothar
显示剩余3条评论

30

除了实现细节以外,wxWidgets的理念始终是尽可能地看起来与本地应用程序一样。我们,wxWidgets开发人员,不总能达到与本地应用程序无法区分的外观目标,但我们始终在努力实现。据我所知,这对于Qt来说并不是一个重要目标,对于GTK+更是如此,因此在我(显然有偏见)的意见中,如果您真的想为用户提供最佳体验,特别是在OS X下,wxWidgets是您的最佳选择。

更精确地回答您的问题,您上面列出的所有内容都是使用wxWidgets在Windows中原生控件实现的(在其他平台下,富文本控件不可用于本地)。


3
wxWidgets 的维基页面有一个好的(诚实且全面的)比较页面,与其他各种工具包进行比较。其中一个有趣的观点是,通过使用本地绑定而不是模拟本地外观,wxWidgets 应用程序更有可能具有本地外观、行为和感觉,但这样做的负面影响是它们更有可能呈现出平台相关的行为或表现出特定于平台的错误。 - waldyrious
5
在wxWidgets维基的比较中,又有一点值得一提(来自讨论页面):“Qt使用本地图形API来渲染本地外观的界面元素等,但它实际上仍然没有使用本地控件。这意味着它们确保了本地外观,而不是行为。Qt中的控件可能看起来很本地化,但操作系统并不认识它们,因为它们实际上并不是本地控件,因此,内置的辅助功能工具(如屏幕阅读器)不总是能够正确地(或根本无法)与Qt应用程序配合使用。” - waldyrious

5

@Roberto 已修复。 - niutech

1
我使用Java进行本机跨平台开发,无需更改代码;使用C/C++ wxWidgets进行独占式跨平台开发,如果您需要提高性能和独立可执行文件;使用C/C++ WinAPI用于Windows和X11用于GNU Linux本地平台和终端控制台;使用Python进行脚本编写,以便快速更新软件和平台;使用汇编语言进行简单的纯控制台编程。有时,我将它们全部组合起来,并使用共享库.dll(在Windows上)和.so(在GNU Linux上)。我喜欢使用小硬件要求进行编程研究的比较性能。

我会比之前的评论者更礼貌地表达:这并没有回答问题,特别是考虑到其他的答案都比较旧了。 - Marc.2377
实际上,他的意思是目前没有可行的解决方案可以成为一名优秀开发人员,并最大化利用当前可用于特定目的的资源。除非你有足够的资金购买Qt,否则这可能是每个人都要走的路。 - TFuto

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