我以前曾有几年时间用 Delphi 和 VCL 来开发工作和业余项目。
近年来我由于各种原因放弃了 Delphi/BCB,转用 C++ 开发兴趣项目。是的,兴趣而已,我从来没有机会在我的日常工作中使用C++。
当涉及到图形用户界面的项目,我需要一个 C++ GUI 框架。

我选择 C++ GUI 框架的标准:

  1. 免费。这是必须的。特别是它应该可以免费静态链接。因此,MFC 不在我的名单里了。MFC 不在 VC 的 Express 版本里。

  2. 开源的。这样我可以阅读代码来学习和调试。闭源库等于是一个黑匣子,我不知道它如何工作,并可能完全失去控制。

  3. 不错的 GUI 可视化设计工具。 不错意味着,至少我应该可以可视化设计最常用的组件形式(不仅是对话框,也包含顶级窗口)。在我看来,图形用户界面的设计应该可视化。手动编码的图形用户 界面枯燥而且容易出错。我希望我的时间和精力都投入到编写核心逻辑而不是界面上。基于这个标准,很多开源框架就从我的名单中消失了。

  4. 不错的应用程序大小。一个带有10M的运行时 DLL 的记事本应用程序应该不是一个好主意。对于大项目这可能不是问题。但重要的是我的项目通常是小型或中型的,永远不会非常大。

  5. 易于安装/配置/构建。在我的印象中(可能错误的),开放源码库很难编译。需要很多的技巧和核心向的改变。我并不想成为某些库的核心,我只想使用开源代码,仅此而已。

  6. 易于集成到任何常用的编译器和集成开发环境。我的主要的开发环境是 VC 2008 Express,我真的很喜欢它。如果我不得不使用其它 IDE,效率可能会打折。此外,我需要使用 MinGW 的 GCC 来测试 C++ 语法。因此,该框架应至少在VC Express和 GCC 上工作。

  7. 代码质量要好。我没有期望一个无 bug 的库,但我也不能接受一个满是 bug 的库。

  8. 文档。我不指望能有 MSDN 那样全面的文档,但一个API文档是必须的。

  9. 社区支持。每当我有一个问题,我需要一个地方问,而且要在合理时间内得到解答。

  10. 用户群。一些较为知名的公司应该用该框架开发过应用程序,以此显示该库的可依赖度。

  11. 跨平台的。这是一个额外要求,但我会很高兴拥有它。

  12. Unicode支持。另一个额外要求,我很高兴能支持 Unicode。


有了这些标准,我发现只有 wxWidgets 和 Qt 是值得考虑的,因为其他库,如 GTKmm,Ultimate++,VCF,SmartWin,难以满足所有要求。 而且 wxWidgets 和 Qt 都有近20年的发展历史,应该比较成熟。


起初我只尝试了Qt的,因为据我所知,wxWidgets是很类 MFC 风格的,而 Qt 的设计更加高级。我觉得可以把 Qt 当成 VCL 风格。

但经过一段时间,我决定放弃 Qt,因为它有几点不足,

  • 太难集成到 VC Express 或 Code::Blocks(一个 IDE 与 GCC 编译器)。对于怎样在 VC Express 上编译 Qt 我实在没有头绪。虽然用 Qt Creator 很容易进行开发,但我不想只局限于任何单一的IDE。我会选择我喜欢的IDE使用。

  • 应用程序过大。对于小型应用程序这是不能接受的。

  • 过于庞大和臃肿的一个库。一个上G字节的库。一个需要几个小时才能建立的库。这意味着,只要有一个错误修复更新,你需要另外的几个小时时间来重新编译。这不是一个GUI框架,而是一个应用框架,超过了我的需要。

  • 非标准C++代码总是不好(即使不坏)的。我真的不喜欢 meta object compiler 的依赖。有很多方法来实现在标准C++信号/槽和RTTI。


在放弃 Qt 之后,我尝试了 wxWidgets,发现我真的很喜欢它,主要体现在几个方面,

  • 非常非常轻松地用 VC Express 和 GCC 成功编译。用VC,只需要几分钟的时间创建整个库。GCC 需时较长,需要大约半小时。

  • 应用程序大小还是不错的,也不算太小,尤其是在2.9.1,程序要大得多。但总体应用程序大小比 Qt 小很多。

  • 库很简洁。它只是一个GUI框架,外加上一些跨平台模块,比如线程,套接字等等。

  • 非常好的 GUI 可视化设计工具(Qt 也有)。事实上,在看 API 文档之前我就尝试过 wxFormBuilder。虽然 wxFormBuilder 远远没有 Delphi 好,但我可以说这已经是一个相当不错的 RAD 工具。我可以放置许多常用的控件,改变布局,定义事件处理程序,这就是我需要的 GUI 设计工具。

  • 这个库正在向一个很好的方向演化。例如,老的 wxWidgets 因为大量 MFC 风格的事件宏而引来非议,但在最新的2.9.1,一个“bind”功能被引入来使用模板和函数对象作为事件处理程序,这是非常现代的 C++ 风格,我认为比 Qt 的 MOC 好多了。此外,我真的很喜欢这个 ribbon 元件,虽然我还没有测试。

  • 良好的社区支持(Qt 也有)。我论坛问了一些问题,都在合理的时间得到答案。


总结:
本文解释了为什么我选择 wxWidgets 而不是 Qt 的原因。仅此而已。我并没有说我更推荐 wxWidgets ,我也没有说 wxWidgets 比 Qt 更好。我只选择了符合我需要的合适的库。如果您正在寻找一个 GUI 库,那么你需要找符合你要求的,因为你可能有不同要求。

posted on 2011-05-04 09:59  kbasm  阅读(11530)  评论(6编辑  收藏  举报