wxWidgets、Qt等界⾯⼯具⽐较
本⽂是在wxWidgets Wiki上⾯到的⼀篇,对⽐了wxWidgets和其他⼀些界⾯⼯具的特点。看到很多朋友在⽹上询问这些库各⾃的特点,我想先把这篇⽂章翻译出来——毕竟这也算是⼀篇官⽅的⽂章,应该⽐较有说服⼒吧!这篇⽂章写于2004年左右,但是很明显某些地⽅已经更新了,因为Qt 4.5是2009年才发布的!
这是我第⼀篇翻译,哪⾥翻译不好敬请谅解!
原⽂:
==================================================
⾸先是关于wxWidgets的⼀些基础知识:
● wxWidgets不仅仅使⽤C++,⽽且能够使⽤python、perl、java、lua、eiffel、C#(.NET)、basic、ruby,甚⾄是javascript(见 )(⾖⼦:有些语⾔连听都没听说过,呵呵);
● wxWidgets是⼀个完整的GUI⼯具库,提供了很多⼯具类;
●有很多⽂档(虽然⼀些只是⽂档⽚段);
●免费供个⼈使⽤或者商业使⽤;
●只要可能,wxWidgets就会使⽤本地平台的SDK。也就是说,同⼀段代码,在Windows下编译将具有Windows程序的外观,在Linux下编译将具有Linux程序的外观;
○这样做的优点是,wxWidgets程序看上去和本地程序差不多,有时也会有⼀些本地组件的⾏为——例如在OS X上所有的⽂本域(text area)都将获得内建的拼写检查的能⼒;
○这样做的缺点是,wxWidgets程序在不同平台的⾏为可能会不⼀致;那些使⽤轻量级组件的GUI库或许会丢失⼀些特定平台的特性,但会将平台相关的代码减到最少(因此,这样做也能够将不同平台组件的⾏为差异降到最⼩,并且减少了特定平台的bugs)。另外,由于使⽤本地感官风格,使得wxWidgets不适合于那些希望具有不同于系统界⾯风格的程序的开发。
下⾯是wxWidgets与不同的GUI库之间的对⽐。
Qt
● Qt( )和wxWidgets⼀样,也具有很多和GUI构建⽆关的类,⽐如⽇期/时间,容器,⽹络,OpenGL功能等;
● Qt 4.5 在Windows、Mac和GNU/Linux下具有两个协议:⼀个是对开源和商业软件的LGPL协议,以及为那些认为从法律⾓度来说认为LGPL不安全的⼈们使⽤的商业协议。⽽所有的wxWidgets版本则是在经过修改的LGPL协议(这个协议已经通过了OSI的认可)下发布的,允许免费开发和发布所有的应⽤程序(⾖⼦:所以Qt那个曾经令⼈颇有微词的许可问题已经不复存在);
● Qt没有wxWidgets所拥有的真正的本地化界⾯。我们的意思是,Qt在各个平台上⾃⼰绘制组件,使⽤⾃⼰的绘制技术将其模拟得很逼真。虽然Qt在Mac OS X,Windows XP 和 Vista上使⽤本地API实现组件的界⾯风格,但是事件处理、结果回调以及组件布局都是由Qt本⾝实现的;
● wxUniversal的实现同Qt类似;
●需要注意的是,在KDE和嵌⼊式Linux平台上,Qt 就是本地GUI库;
● Qt被很多⼤型项⽬使⽤,如KDE和Opera浏览器(另⼀⽅⾯,wxWidgets也被⽤于AOL Communicator之类的项⽬);
● Qt极⼤限度地使⽤了虚函数(Qt所有组件的基类QWidget包含⾄少51个虚函数),这⽐wxWidgets更加⾯向对象(相⽐⽽⾔,wxWidgets更多的使⽤了类似于MFC的宏)。这意味着,使⽤Qt你的代码⾏数将少⼀些,但是wxWidgets的执⾏速度将快⼀些(这取决于你向谁去问这个问题);
● Qt被IBM和Borland Kylix(已经停⽌更新)使⽤,这意味着更加可靠。但是,有传⾔说wxWidgets将被应⽤于下⼀版本的C++BuilderX;
xcode界面● Qt在GNU/Linux上⼀套完整的包含帧缓冲(framebuffer)嵌⼊式GUI(Qt for Embedded Linux),使得你能够⾮常容易的使⽤。这意味着⼀旦你有了带
有/dev/fb的Linux,你就可以在⼏分钟内准备好。Qt for Embedded Linux 同X11相⽐只有很⼩的差别;
● Qt的IDE很多,QtDesigner、QtCreator、QDevelop、Edyuk等,也能够同流⾏的IDE,如Visual Studio、Eclipse或者XCode,进⾏整合(wxWidgets也有);
● Qt提供全⾯的商业⽀持(其实wxWidget也有提供,见);
●你可以使⽤基于Qt实现⼀个wxWidgets,同样,wxWidgets通过使⽤wxGTK和GTK-Qt也能模拟Qt。
FLTK
● FLTK的⽹站:;
● wxWidgets更加⾯向对象;
● FLTK更加轻量级,⽽wxWidgets更加全⾯(wxWidgets⽀持⽹络、打印等,⽽FLTK仅⽀持少量或不⽀持这些特性)。参见wxWidgets功能列表(),FLTK 功能列表();
● FLTK实际上有更多细致不同的组件类型,只要⽐较⼀下在FLUID和wxDesigner或者DialogEdit中你所能做的就知道了。我曾经尝试将⼀个FLTK应⽤程序⼀直到wxWidgets上,仅模拟那些按钮就花费了相当多的时间;
● FLTK使⽤的修改后的LGPL协议⽐wxWidgets的协议更加严格,虽然它也提供了静态链接的不同情况;
● FLTK有⼀个能够进⾏GUI设计的IDEFLUID()。
FOX
● FOX站点:;
● FOX更加轻量级,⽽wxWidgets则是全功能的;
● wxWidgets有⼀个完整的API,⽽FOX仅仅关注于GUI特性;
●类似于Qt,FOX在每个平台绘制出其组件,⽽不是使⽤本地组件;相⽐之下,wxWidgets使⽤的是本地API。因此,FOX可能更快⼀些,但是它提供的界⾯可能不能很好的融⼊⽬标平台(例如,不能应⽤Windows XP的主题风格);
● FOX缺少打印⽀持,但是⽀持亚洲⽂字的I18N(它内部使⽤UTF-8编码)(⾖⼦:这段原句是FOX lacks printing and I18N support for asian language (it's using UTF-8 internally). ,但原⽂的意思是缺乏I18N的,可后⾯⼜说使⽤UTF-8编码,因此估计是语误。于是到⽹上查了⼀下,FOX 1.6版之前是没有I18N 的,1.6版才使⽤UTF-8编码);
● FOX不⽀持Windows标准对话框,但有⼀个替代⽅案。
Java
● Java是⼀个能够使⽤不同GUI库(,,, Jambi,甚⾄)的编程语⾔。wxWidget是⼀个GUI API,因此⼆者能够很好的结合;
● Java程序在运⾏时编译成字节码,这意味着当⽤户第⼀次启动程序时,将耗费更长的时间,⽽程序相应也会⽐较迟钝(Java的本地编译器GCJ已经可⽤,但是并不⽀持Java所有的特性);
●另⼀⽅⾯,wxWidgets直接编译成机器码,因此运⾏很快;
●没有混淆的Java字节码很容易反编译出来。如果你的应⽤程序是开源的,这⽆所谓,但是如果能够查看源代码成为⼀个问题,那你就得想想办法了(编译成本地代码的wxWidgets程序也能够被反编译,但是这个过程要⽐反编译Java字节码困难得多);
●使⽤基于Java的应⽤程序必须安装JVM。近年来,随着JVM的普及,这已经不是⼤问题,但是,如果⽤户使⽤的是旧版本的JVM,则可能会有性能或者安全的问题;
●鉴于Java库运⾏较慢,⼀些Java库是使⽤的wxWidgets和C++编写的!
●上述问题的⼀个例⼦是wx4j,⼀个Java的wxWidgets实现。wx4j⽤wxWidgets绑定Java,可以让Java程序员使⽤Java语⾔,但是拥有C++程序的速度;
●为了实现跨平台,Java组件仅提供了各个平台公共的特性,⼀些平台相关的特性从Java API中去除了,这些包括Windows的任务栏,Mac OS的菜单栏和Unix的⽂件属性等;
●相⽐⽽⾔,如果你仅在⼀个平台上进⾏编译,wxWidgets允许你直接使⽤平台相关的代码代替 ifdef 预编译,并且wxWidgets也有在不同平台模拟的组件,如MDI和树控件;
● Java程序⽐C++程序占⽤更多的内存;
● “⼀次编写,到处运⾏”依然是⼀个神话。所有的JVM都含有bugs,并且在⼀个平台上编写⼀个“⼤”的Java程序,让它在另外的平台也能运⾏,简直是痴⼼妄想。并不是说这些问题wxWidgets都解决了,只是它的情形并不会更糟;
● wxWidgets在某些⽅⾯更完整更直观。对⽐⼀下wxString和,留意⼀下它们的特性和⽂档质量;
●⼀些Java拥护者说下⼀版本的JVM将会解决很多速度的问题,但是(⾖⼦:这个对⽐是2004年的,已经不⾜为信了,不过,⾖⼦也没有去更新的资料)。
SDL
● SDL⽹站:;
● SDL(Simple DirectMedia Layer)是⼀个多媒体的C库,适合于游戏以及⾃定义组件,对于通⽤GUI组件并不很⽅便。它由很多SDL_开头的C结构组成;
●对⽐⼀下wxWidgets和SDL:;
● SDL在LGPL version 2下发⾏;
● SDL仅允许单窗⼝运⾏;
●极好的OpenGL集成(或者是构建在OpenGL之上的类库,如OpenSceneGraph,CEGUI)。
SFML
● SFML⽹站:;
● SFML(Simple and Fast Multimedia Library)是⼀个多媒体的C++库,适合于游戏开发以及⾃定义组件,对于通⽤GUI元素并不⽅便;
● SFML包含很多功能:⾳频、⽹络、线程等;
● SFML可以结合wxWidgets、Qt或者X11等使⽤。
Allegro
● Allegro⽹站:;
●类似于SDL,Allegro是⼀个适⽤于游戏开发跨平台C库(包含很多后台使⽤的组件);
●⼏乎和wxWidgets⼀样古⽼(⼤约1993年);
● Giftware协议(实质上是public domain);
●需要使⽤gcc和⼀个汇编器构建;
●在同⼀版本已经停⽌开发多年了,缺乏核⼼开发成员(原来的开发者已经不在开发团队了),存在⼀些内部的争论者;
●⾮常基础的GUI功能,仅仅⽀持⼀个仅有边框的窗⼝——你甚⾄不能移动这个窗⼝!
● “控件”仅仅是通过变长参数列表的函数进⾏⽀持,像Qt⼀样⾃⾏绘制(默认的并不好看)。可以使⽤很简单的API进⾏⾃定义(有⼀些⼦库提供了⽐较好看的版本的控件);
●绘图当然要⽐wxWidgets快得多,有⼀个OpenGL层()使使⽤OpenGL进⾏绘制要⽐原来容易很多;
●⾮GUI部分(输⼊等)是底层的,通常⽐wxWidgets的本地实现快⼀些;
●能够同wxWidgets共同使⽤,虽然Allegro有⼀些平台相关的函数去获取窗⼝句柄,但你也可以通过这个窗⼝句柄创建⼀个wxWidgets窗⼝,并且⽤它指向的那个窗⼝做任何事情。⽽wxWidgets使⽤wxApp指向平台相关的main/WinMain stuff。Allegro要求你在main函数之后添加END_OF_MAIN()。这是整合wxWidgets和Allegro的主要要求,但并不是很⼤的⼯作量。
==================================================
跨平台的C++ GUI⼯具库很多,可是应⽤⼴泛的也就那么⼏个,Qt、wxWidgets便是其中的翘楚。
这⾥把GTK+排除在外,以C实现⾯向对象,上⼿相当困难,⽽且Windows平台下执⾏相当慢且不稳定。
Qt和wxWidgets各有各的优点,也各有各的缺点,各有各的适合应⽤点。
⼯作环境和爱好限制,个⼈曾经分别使⽤过Qt和wxWidgets,
到现在,就个⼈⽽⾔,选择在⼀般程序⽅向采⽤wxWidgets,在⼿机应⽤程序⽅向采⽤Qt。
先说版权:
Qt,是芬兰的TrollTech公司研发的,现在属于Nokia,⼀直奉⾏的是双LICENSE策略,⼀个是商业版,⼀个是免费版:
商业版的LICENSE就不说了,免费版的LICENSE,4.5版本之前⼀直采⽤GPL,意味着采⽤Qt的程序要么是商业软件,要么就是GPL软件,
这就造成了虽然出了个著名的KDE,可惜应⽤范围还是受限,否则的话,应⽤应该更⼴阔点;
不过还好,Nokia收购了之后意识到这个问题,4.5版本之后采⽤了LGPL,其他开发⼈员可以发布基于免费Qt库连接的商业软件了。
wxWidgets,⼀直奉⾏的是LGPL LICENSE。
再评评各⾃的优缺点:
Qt,⼀直以来开发公司作为商业公司进⾏运作,以客户需求为⽬标,提供了⼀系列完整的⽂档和RAD⼯具,并提供最为完整的平台⽀持;
对开发⼈员⽽⾔,Qt库本⾝,也是所有的GUI⼯具库中最为⾯向对象化的,同时也是最为稳定的。
罗列⼀下:
Qt的优点:
1. ⽀持的平台最多
2. 商业化⽀持
3. 完整的⽂档和RAD⼯具
4. 最为⾯向对象
5. 世界上最为成功的⼿机⼚商⽀撑,对于移动终端的⽀持最为完善
Qt的缺点:
1. 使⽤的是⾮标准C++
2. 每个平台不是"Native GUI"
3. 过于庞⼤且运⾏缓慢
4. 与其它库不是很兼容(主要是STL之类的兼容问题)
5. 基本只能使⽤特定的qmake⼯具(其它⼯具经过良好的修改也可以,不过相当于重新编写⼀个qmake,是否值得)
wxWidgets,⼀直以来的LGPL发布,相当开放,积累了相当⼀部分研究⽤户,与现有各类⼯具库⽆缝连接地⾮常好;
同时可惜的是没有⾮常强⼤的正规商业化运作,可靠性、资源丰富性远⽐不上Qt。
还是罗列⼀下:
wxWidgets的优点:
1. 开放,对于各类第三⽅库的良好兼容(TAO⼯具中的Naming_Service Viewer就是采⽤wxWidgets的)
2. ⽀持各平台的"Native GUI"
3. 虽然有庞⼤的库,运⾏效果极为显著
4. 对各类现有⼯具的⽀持(笔者就采⽤MPC⼀站式产⽣所有项⽬的编译⼯程)
5. 偏MFC,对于Windows平台MFC程序的跨平台迁移,具有天然的优势
6. XRC,则提供了代码和设计分离的便利,程序员专注整体开发,UI设计体则提供运⾏期界⾯、多语⾔版本⽀持功能等
wxWidgets的缺点:
1. 由于是偏MFC,则⾯向对象封装做得不是⾮常好
2. 相对缺乏的⽂档、资源
3. 缺乏很好的商业化⽀持,如果商业软件出问题需要⽀持,稍微⿇烦点
总之:
在采⽤第三⽅⼯具库的复杂PC应⽤环境,有⼀定的底⼦,wxWidgets是不⼆的选择
在只需采⽤Qt单⼀⼯具库的应⽤环境,Qt是个不错的选择;特别是类似于⼿机这种嵌⼊式设备环境,由于Nokia的加⼊,Qt更值得⼀⽤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论