作者从结构特点,界面特点,运行效率,开发授权以及学习难度等方面分析对比了 wxWidget,gtk++,Qt 三大 C/C++ GUI框架,可以使读者对 C/C++ GUI 开发框架的开发应用得到进一步认识。
Qt 是一个著名的 C++ 库——或许并不能说这只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI。使用 Qt,在一定程序上你获得的是一个“一站式”的服务:不再需要研究 STL,不再需要 C++ 的<string>,因为 Qt 有它自己的 QString 等等。或许这样说很偏激,但 Qt 确实是一个 “伟大的 C++ 库”。
我们所使用的 Qt,确切地说也就是它的 GUI 编程部分。C++ 的 GUI 编程同 Java 不同:GUI 并不是 C++ 标准的一部分。所以,如果使用 Java,那么你最好的选择就是 AWT/Swing,或者也可以使 SWT/JFace,但是,C++ 的 GUI 编程给了你更多的选择:wxWidget, gtk++ 以及 Qt。这几个库我都有接触,但是接触都不是很多,只能靠一些资料和自己的一点粗浅的认识说一下它们之间的区别。
首先说 wxWidget,这是一个标准的 C++ 库,和 Qt 一样庞大。它的语法看上去和 MFC 类似,有大量的宏。据说,一个 MFC 程序员可以很容易的转换到 wxWidget 上面来。wxWidget 有一个很大的优点,就是它的界面都是原生风格的。这是其他的库所不能做到的。wxWidget 的运行效率很高,据说在 Windows 平台上比起微软自家的 MFC 也不相上下。
gtk++ 其实是一个 C 库,不过由于 C++ 和 C 之间的关系,这点并没有很大的关系。但是,gtk++ 是一个使用 C 语言很优雅的实现了面向对象程序设计的范例。不过,这也同样带来了一个问题——它的里面带有大量的类型转换的宏来模拟多态,并且它的函数名“又臭又长(不过这点我倒是觉得无所谓,因为它的函数名虽然很长,但是同样很清晰)”,使用下划线分割单词,看上去和 Linux 如出一辙。由于它是 C 语言实现,因此它的运行效率当然不在话下。gtk++ 并不是模拟的原生界面,而有它自己的风格,所以有时候就会和操作系统的界面显得格格不入。
再来看 Qt。和 wxWidget 一样,它也是一个标准的 C++ 库。但是它的语法很类似于 Java 的 Swing,十分清晰,而且 SIGNAL/SLOT 机制使得程序看起来很明白——这也是我首先选择 Qt 的一个很重要的方面,因为我是学 Java 出身的 。不过,所谓“成也萧何,败也萧何”,这种机制虽然很清楚,但是它所带来的后果是你需要使用 Qt 的 qmake 对程序进行预处理,才能够再使用 make 或者 nmake 进行编译。并且它的界面也不是原生风格的,尽管 Qt 使用 style 机制十分巧妙的模拟了本地界面。另外值得一提的是,Qt 不仅仅运行在桌面环境中,Qt 已经被 Nokia 收购,它现在已经会成为 Symbian 系列的主要界面技术—— Qt 是能够运行于嵌入式平台的。
以往人们对 Qt 的授权多有诟病。因为 Qt 的商业版本价格不菲,开源版本使用的是 GPL 协议。但是现在 Qt 的开源协议已经变成 LGPL。这意味着,你可以将 Qt 作为一个库连接到一个闭源软件里面。可以说,现在的 Qt 协议的争议已经不存在了——因为 wxWidgets 或者 gtk+ 同样使用的是类似的协议发布的。
初学者使用 Qt4 进行 C++ GUI的开发,可以参照《C++ GUI Programming with Qt4》一书。我是一个 Java 程序员,感觉 Qt4 的一些命名规范以及约束同 Java 有异曲同工之妙,因而从 Java 迁移到 Qt4 似乎困难不大。不过,这也主要是因为 Qt4 良好的设计等等。