这篇文章包含了这个领域的很多开源项目的介绍,还有我多年来的心血和汗水
去年夏天的时候,我用QT做了一个小工具后来还用QT做了流程设计器
说实在的,QT确实挺强大的,
如果你有一个项目,需要跨平台GUI开发,你又有一个C++团队的话,
那么做技术选型的时候,可以负责任的说,QT是不二之选
这时可能有人会提到GTK+,
我想说的是GTK+对windows平台的支撑力度实在是少的可怜
linux的版本已经到了3.16了,windows的版本才到3.6,整整差10个版本(我这里说的是GTK3)
而且大部分常见的控件在windows上都没有
来看看我在一个开源项目上踩的坑吧。
当然还有人可能提到wxWidgets,这玩意儿我没有深入研究过
只知道它是在原生图形API上再做的包装,想想windows API搞出来的窗口有多古板,还是算了。
类似的还有iup,跟wxWidgets的原理是一样的。
还有人直接用游戏库做GUI程序的,比如nimx和nanovg
nimx是基于SDL2图形引擎搞出来的GUI框架
我在nimx上踩到两个坑,其中一个提交pull request给作者,作者也认了
第二个坑就直接把我坑死了。
nanovg是基于OpenGL图形引擎搞出来的GUI框架。
这个项目还是in progress状态。
总之,这两个项目都不能用于生产。
(我本想说,国内*兄...,但貌似他也已经肉身FQ了,再提国内也不对了)
这个项目我了解的不多,只在14年春天的时候,搭过环境,写过hello world
前段时间学习nim语言,兴致勃勃跑到github上问作者要dll,打算用nim做个包装
后来才知道,作者是不会提供了,好遗憾。
gacui的原理我不太清楚,只知道有GPU加速。
当然还有基于Direcut UI发展而来的duilib
这个库也是国内一位朋友搞出来的
duilib应该是受这个项目的启发才建成的
国内很著名的一个收费UI库UI Power也是基于这个思路搞出来的
在国内开发GUI应用程序,更多的还是给windows平台下的用户用
如果你想最大*度的定制你的界面,又不想让你的程序的发型版看起来太大
那么duilib是个不错的选择,但duilib文档太少(作者自己也这么说),你要做足这方面的准备
好在是开源的,你C++够牛的话,也不用担心
当然如果你希望有完善的文档来给你提供帮助的话,
那么你可以选择Qt,毕竟是国外大厂商,源码、IDE、文档、社区都很齐全
这里不得不提一下国内的qtcn社区,挺不错的,里面有不少这个领域的专家,而且都挺热情的
但是Qt的依赖库库实在太多,你开发好的程序怎么着也得有个十几兆,才能分发给别人。
而且我相信你肯定会用到process explorer或者dependencywalker之类的工具来查找你的程序到底依赖了哪些dll
好吧,如果你足够厉害、有一台性能超赞的电脑、有一两个小时的时间,你可以尝试静态编译QT
如果你开发的GUI程序只给windows平台下的用户用
那么最最基本的三个选择:windows api、MFC、WTL
用windows api做GUI程序,比较辛苦,因为它就是一系列的API,所有的事情都得你自己来做
MFC是一套非常庞大的类库,他里面包含了一系列的C++的机制,用起来非常繁琐
WTL比MFC简单,比windows api易用,但资料很少
你如果要走WTL这条路,那么你一定会看《深入解析ATL》这本书(友情提醒,这本书最新版翻译的实在太烂了)
好,再来说用混合开发技术做GUI程序
这种技术方式的主要原理就是:
你写代码包住浏览器内核,
界面代码用HTML/CSS/JS完成(这是最大的优势,你可以用所有与之相关的库)
所有与界面渲染相关的事情交给浏览器内核完成,
所有与系统相关的事情你自己完成
这项技术在移动端用的挺好的,
如果你要做一个移动端的项目,又打算走混合开发这条路的话,
我强烈推荐dcloud的mui,真的很不错,
appcan很早之前了解过一点,貌似是收费的
PC端的混合开发就不那么火了,
但有很多大厂偷偷也在用这个技术,比如:鹅厂
如果你要做PC端的混合开发,
你有三条路可以走,
封装IE浏览器的内核、
封装谷歌浏览器的内核、
封装Webkit浏览器的内核、
如果你要选用IE浏览器的内核,
那么你就不可能考虑跨平台的事情了,
而且,因为你的用户可能使用了不同的windows操作系统
所以你要做好客户端IE浏览器版本不一致的准备
IE6\7\8\9\10\11...
到IE9才可以称得上现代化的浏览器,市面上很多前端库,也只兼容到IE9
用IE内核来做这个事情的好处是:
你不用把浏览器的一堆DLL,分发给你的客户,这是其他三个方案所不能比的。
webkit和firefox真是挺尴尬的
性能表现没有谷歌浏览器好
平台支撑没有IE浏览器好
我对firefox浏览器的Gecko内核几乎没有什么研究
(之前做浏览器插件的时候看过他的API,现在几乎都忘记了)
Qt在去年之前还只有对webkit的封装
我曾经在前年,把webkit和extjs整合起来,做了一个库,
大家可以研究一下,但请不要用于生产,我已经不再维护这个库了
国外也有人用.net封装过webkit,但作者在10年左右,就不再维护这个项目了
终于说到谷歌浏览器的内核:chromium
我实在是不建议直接研究它
你可以看看CEF这个项目
这个项目是用C++对chromium做的包装
之前不支持中文输入法的光标跟随,现在也已经被fix掉了
如果你是C#开发人员,也想用CEF的话,
那么你可以考虑使用cefglue、cefsharp、chromiumfx
这三个项目我都用过,目前的状况来看,我推荐最后一个
你如果是一个JS开发人员的话,
有我nodejs的庇佑,你完全不用care CEF这种东西
你可以直接选用nw.js
这个东西,我也用过,
除了nodejs带来的那些缺点,
他几乎是完美的,非常不错,推荐使用
还想再多说一些,但忽然发现,篇幅已经太长了,借曹雪芹的一首诗止笔:
满纸荒唐言!一把辛酸泪!一把辛酸泪!一把辛酸泪!.......