vxWidgets(一):初识
wxWidgets 和 QT 之间的选择
跨平台的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更值得一用
第一个程序
#include <wx/wx.h> class OurApp: public wxApp { bool OnInit() { wxFrame* frame = new wxFrame(NULL, wxID_ANY, "Our First App"); frame->Show(); return true; } }; IMPLEMENT_APP(OurApp);
其中IMPLEMENT_APP(OurApp)即为main入口,其定义为
#define wxIMPLEMENT_WXWIN_MAIN_CONSOLE \ int main(int argc, char **argv) \ { \ wxDISABLE_DEBUG_SUPPORT(); \ \ return wxEntry(argc, argv); \ }
//常用头文件
#include <wx/app.h> #include <wx/button.h> #include <wx/checkbox.h> #include <wx/checklst.h> #include <wx/choice.h> #include <wx/dataobj.h> #include <wx/dc.h> #include <wx/dcmemory.h> #include <wx/dialog.h> #include <wx/dir.h> #include <wx/frame.h> #include <wx/image.h> #include <wx/imaglist.h> #include <wx/log.h> #include <wx/msgdlg.h> #include <wx/notebook.h> #include <wx/radiobut.h> #include <wx/settings.h> #include <wx/sizer.h> #include <wx/splitter.h> #include <wx/spinctrl.h> #include <wx/statbmp.h> #include <wx/stattext.h> #include <wx/statusbr.h> #include <wx/sysopt.h> #include <wx/textdlg.h> #include <wx/treectrl.h> #include <wx/xrc/xmlres.h>
程序编译:
g++ *.cpp -o a.out `wx-config --cflags --libs`
这样第一个程序就完成了