最近一直在写一个基于QT-Webkit的浏览器插件,这个项目做了2个月了,一直是基于QT开发,也让自己对QT-Webkit有了一些了解,所以想把这些经验记录下来。
1 QT-Webkit介绍
QT-Webkit是将Webkit移植到QT的一个开源项目,目前最新的版本是QT-Webkit 2.2,其已经加入到QT 4.8中,正是由于这个开源项目,我们可以很方便的在QT中开发需要渲染网页的项目,甚至是通过信号和槽机制让js和C++交互,这些都要归功于QT-Webkit。使用它可以很方便的开发出一款功能相对完善的浏览器来,具体的例子可以看看QT自带的demo,其强大可见一斑。
2 QT-Webkit入门
QT-Webkit在学习上可以从QT自带的浏览器demo入门,阅读里面的代码,不懂的查qt-assistant,非常方便。
其次,在总体把握上,要理解QWebview、QWebpage,QWebframe等类的关系,这几个类是最核心的类,几乎所有基于QT-webkit的程序都要用到,同时,QT-Webkit也对cookie,历史记录接口做了封装。还有一点很重要,就是通过QT-Webkit提供的机制让代码和页面的js交互,这个是很重要的,QT-Webkit提供了相对完善的机制,具体可看这里。
3 QT-Webkit对插件的支持
这里着重说一下QT-Webkit对插件的支持,它支持两种插件,一种是基于QT-Webkit自有插件,即继承自QWebPluginFactory的插件,详见这里。还有一种,是基于NPAPI的插件,其源自Netscape浏览器,目前被很多浏览器支持。
这两种方法各有利弊,
使用QT-Webkit自有插件系统创建的插件,可以很方便的使用QT-Webkit,甚至是QT提供的各种高层API的封装。其缺点,也是我目前最纠结的一点是,它无法支持html的z-index,无论怎么设插件的z-index,其始终处于最顶层,也就是把所有其他div全部遮挡,这个似乎是QT-Webkit的已知bug,也有人在stackoverflow上提问,不过也没有答复,这里也向解决了此问题的同学求助,希望能相互探讨下。
而用NPAPI创建的插件则可以解决以上问题,因为它支持window和windowless两种模式,Flash就是很好的例子。但是其缺点也明显,是用它的话,相当于放弃QT来开发插件了,工作量相对会大些。