【问题标题】:Which, if any, achieves Windows native look: GTK+, wxWidgets, Qt, FLTK?哪个(如果有)实现了 Windows 原生外观:GTK+、wxWidgets、Qt、FLTK?
【发布时间】:2013-09-29 14:23:00
【问题描述】:

我需要编写一个应用程序,该应用程序在视觉上与为 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 可能无法做到这一点。你们中的许多人一定知道答案了...

【问题讨论】:

  • wxWidgets 使用原生 GUI 控件。
  • Qt 也使用原生 GUI 控件
  • "Qt 使用原生的 graphics API 来渲染看起来像原生的界面元素等,但它实际上并没有使用原生控件本身。这意味着它们确保天生的外表,而不是行为。” (来自wiki.wxwidgets.org
  • 谁能提供一个使用 GTK、wxwidgets、FLTK、QT 或 Ultimate++ 的知名应用程序列表,好吗?比较它们的外观可能会很好。
  • @skan 你可以在这里寻找使用 xwidgets 的应用程序:en.wikipedia.org/wiki/Category:Software_that_uses_wxWidgets

标签: c++ windows user-interface gtk wxwidgets


【解决方案1】:

FLTK我不知道就不说了。

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

根据我自己的经验,wxWidgets API 非常难看,因为它有太多的方法只能在一个或另一个平台上使用,这使得东西不可移植,除非你想办法解决它。与 GTK+ 和 Qt 不同,它还在它用作后端的工具包之上添加了自己的错误层。但是,由于它使用的是原生工具包,它会努力保持平台的原生外观。

GTK+ 3 在 Windows 上仍有一些粗糙的边缘,它从 GTK+ 3.6 开始正式支持。 GTK+ 项目将 Windows 二进制文件的分发委托给 MSYS2 项目。由于您已经在使用 MinGW,这几乎是相同的环境。他们与 GTKmm 有很好的 C++ 绑定。但是,您可能需要做一些工作才能使主题适合您的 Windows 版本。

Qt 是跨平台 C++ 开发的不错选择,主要目标是 Windows,试图模仿平台的原生外观,但 has its own theming limitations too.

总结起来,只有两种方法:

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

两者各有利弊。

【讨论】:

  • 我最初以为我会使用 wxWidgets,因为这种伪造的方法经常会出现微妙的错误,这让用户很恼火。此外,它不是面向未来的。考虑可插拔主题,你不能全部伪造它们。但随后stackoverflow.com/a/5800101/1143274 这个答案让我确信我必须坚持使用普通的 WinAPI,因为我的应用程序在启动延迟方面必须很快。我进行了足够多的搜索以确认没有一个轻量级库可以为我执行常识默认初始化和 WinAPI 宏,所以我必须自己做。
  • wxWidgets 在使用原生 UI 时如何“非常难看”?使用 wx 开发的应用程序与使用平台标准工具包开发的应用程序没有区别。
  • 我说的是 wxWidgets API,而不是外观。
  • @Evgeni:WinAPI 加载时间很快,因为它是原生的。但这是一个糟糕的选择,无法维护,而且级别如此之低,与更高级的工具包相比,它需要 3 倍或更多的代码来做同样的事情。启动时间并不是生活中唯一的事情。
  • 不幸的是 wxWidgets 看起来不太好,rebar/toolbars 和ribbons 等类没有使用本机控件。刚查了3.0版本,很快就决定放弃了。并且不可能拥有像 MFC Featurepack 这样的视觉效果(Office 蓝色)。
【解决方案2】:

抛开实现细节不谈,wxWidgets 的理念是,并且一直是,尽可能地看起来原生。我们,wxWidgets 开发人员,并不总是能实现与原生应用程序没有区别的目标,但我们总是努力做到这一点。 AFAIK 这不是 Qt 的重要目标,也绝对不是 GTK+,所以在我(显然有偏见)看来,如果您认真为您的用户提供最佳体验,尤其是在 OS X 下,wxWidgets 是您的最佳选择。

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

【讨论】:

  • wxWidgets wiki 有一个不错的(诚实而全面的)comparison 以及各种其他工具包。一个有趣的观点是,通过使用原生绑定而不是模拟原生外观,wxWidgets 应用程序更有可能在外观、行为和感觉上都是原生的,但这样做的负面影响是它们更有可能呈现依赖于平台的行为或显示特定于平台的错误。
  • wxWidgets wiki(来自讨论页面)的比较中的另一个好点:“Qt 使用原生 graphics API 来呈现原生界面元素等,但是它仍然没有实际使用本机控件本身。这意味着它们确保了本机外观,而不是行为。Qt 中的控件可能看起来是本机的,但操作系统不会识别它们,因为它们实际上并不是原生控件本身,因此,像屏幕阅读器这样的内置辅助功能工具并不总是(或根本不)与 Qt 应用程序一起正常工作。”
【解决方案3】:

IUP - Portable User Interface library 使用原生小部件、C API 和 Lua 绑定。

【讨论】:

  • @Roberto Fixed.
【解决方案4】:

我在不更改代码的情况下将 java 用于本机跨平台,如果你想提高性能和独立可执行文件,我将 c/c++ wxwidgets 用于专门的跨平台,将 c/c++ winapi 用于 windows,x11 用于 gnu linux本机平台和终端控制台,如果您希望您的软件快速更新,则使用 python 作为脚本控制台和平台,并使用汇编作为一个简单的纯控制台。有时我将它们与 Windows 上的共享库 .dll 和 gnu linux 上的 .so 结合起来。而且我喜欢在对硬件要求较低的编程研究中进行比较性能。

【讨论】:

  • 我会尝试把它比之前的评论者做得更好:这并不能提供问题的答案,特别是考虑到其他答案要旧得多。
  • 实际上,他的意思是,目前没有可行的解决方案可以衡量成为一名优秀的开发人员,并最大限度地利用当前可用的特定用途。除非你有 Qt 的 ca$h,否则这可能是每个人都遵循的路径。
猜你喜欢
  • 2013-01-21
  • 2014-06-08
  • 2019-02-21
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2011-11-13
  • 2012-06-22
相关资源
最近更新 更多