QTWebkit中的webkit/qt/api文档
QTWebkit中的webkit/qt/api文档
概述
该目录下的文件均以前前缀qweb开头,主要用于支持前端的实现。核心的类为:qwebview、qwebpage、qwebframe等三个类。这三者间的关系由图描述。(注:图来自QTWebkit自带文档)
图1 qwebview,qwebpage,qwebframe三者关系
View是一个逻辑视图,真正的工作分别由page和frame完成。Page负责处理用户action、navigation和text editor等工作;frame则负责绘制工作。从webkit的角度来看,page与frame是一对多的关系,因为一个page下可以有frame tree,但通常是一对一的关系。从构造顺序来看,Page先于frame构造。
类qwebsetting是管理配置信息的,比如主页地址、代理、是否启用javascript、是否显示图片、是否支持插件等。
类详解
类图
QWebView
QWebView为QWidget的子类。QWidget是QT平台的PlatformWidget。
QWebView.cpp对类QWebView有较为详细的说明。感兴趣的话,大家可以看看。
QWebView提供了一个widget用于显示和编辑web文档。
QWebView是QtWebKit web browsing模块的主要widget组件。
常用API
load – load a url from local / remote
history() – 访问历史记录对象
settings() – 访问settings对象
url() – 读取当前url
title() – 读取当前title
triggerPageAction – 处理web action
event()
QWebPage
QWebPage.cpp中对QWebPage做了较为详细的说明。感兴趣的话,大家可以看看。
QWebPage类提供了可用于显示和编辑web文档的对象。
QWebPage负责web content,setting,history,navigation。在widget-less的环境下,QWebPage可以和QWebFrame协同工作,完成QWebView类似的功能。
NavigationType表
NavigationType |
NavigationTypeLinkClicked |
NavigationTypeFormSubmitted |
NavigationTypeBackOrForward |
NavigationTypeReload |
NavigationTypeFormResubmitted |
WebAction表
(方法QWebPage::triggerAction触发特定的action)
WebAction |
|
NoWebAction |
不做任何操作 |
OpenLink |
打开当前链接 |
OpenLinkInNewWindow |
在新window中打开当前链接 |
OpenFrameInNewWindow |
在新window中复制当前frame |
DownloadLinkToDisk |
保存当前link |
CopyLinkToClipboard |
拷贝当前link到剪切板 |
OpenImageInNewWindow |
在新window中打开image |
DownloadImageToDisk |
保存image到disk |
CopyImageToClipboard |
拷贝image到剪切板 |
CopyImageUrlToClipboard |
复制image的url到剪切板 |
Back |
Navigate back |
Forward |
Navigate forward |
Stop |
停止load当前页面 |
StopScheduledPageRefresh |
停止所有挂起页面的刷新或重定向 |
Reload |
重载当前页面 |
ReloadAndBypassCache |
重载当前页面,不使用本地cache |
Cut |
剪切 |
Copy |
复制 |
Paste |
粘贴 |
Undo |
撤消最近的一次编辑 |
Redo |
Redo最近的一次编辑 |
MoveToNextChar |
移动光标到下一个字符 |
MoveToPreviousChar |
移动光标到上一个字符 |
MoveToNextWord |
移动光标到下一个词 |
MoveToPreviousWord |
移动光标到上一个词 |
MoveToNextLine |
移动光标到下一行 |
MoveToPreviousLine |
移动光标到上一行 |
MoveToStartOfLine |
移动光标到行的开始处 |
MoveToEndOfLine |
移动光标到行的结尾处 |
MoveToStartOfBlock |
移动光标到block的开始处 |
MoveToEndOfBlock |
移动光标到block的结尾处 |
MoveToStartOfDocument |
移动光标到文档的开始处 |
MoveToEndOfDocument |
移动光标到文档的结尾处 |
SelectNextChar |
选择下一个字符 |
SelectPreviousChar |
|
SelectNextWord |
|
SelectPreviousWord |
|
SelectNextLine |
|
SelectPreviousLine |
|
SelectStartOfLine |
|
SelectEndOfLine |
|
SelectStartOfBlock |
|
SelectEndOfBlock |
|
SelectStartOfDocument |
|
SelectEndOfDocument |
|
DeleteStartOfWord |
|
DeleteEndOfWord |
|
SetTextDirectionDefault |
|
SetTextDirectionLeftToRight |
|
SetTextDirectionRightToLeft |
|
ToggleBold |
Bold和normal间切换 |
ToggleItalic |
Italic和normal间切换 |
ToggleUnderline |
Underline和normal间切换 |
InspectElement |
|
InsertParagraphSeparator |
插入一个新的段落 |
InsertLineSeparator |
插入一个新行 |
SelectAll |
选择全部内容 |
PasteAndMatchStyle |
从剪切板中粘贴内容并使用当前样式 |
RemoveFormat |
删除格式和样式 |
ToggleStrikethrough |
Strike和normal间切换 |
ToggleSubscript |
Subscript和baseline间切换 |
ToggleSuperscript |
Superscript和baseline间切换 |
InsertUnorderedList |
|
InsertOrderedList |
|
Indent |
给当前选择的block增加一个Intent |
Outdent |
给当前选择的block减一个Intent |
AlignCenter |
内容中间对齐 |
AlignJustified |
内容两边对齐 |
AlignLeft |
内容左对齐 |
AlignRight |
内容右对齐 |
WebWindowType表
WebWindowType |
|
WebBrowserWindow |
规则的web browser window |
WebModalDialog |
行为和modal dialog一样 |
Alert、Confirm和Prompt
Javascript中的alert、confirm、prompt三个弹出对话框,通常由chromeclient来实现。在qtwebkit中,这三个弹出对话框的实现放在了QWebPage中。三个实现均使用了QMessageBox类。宏QT_NO_MESSAGEBOX需要关闭。或者说,只有qt支持MessageBox才可以。
Android自带的browser不支持弹出对话框,alert、confirm、prompt以log方式打印。可以自定义一个chromeclient实现这三个方法。
Event
QT中的event由类QEvent定义。其子类QKeyEvent、QMouseEvent、QTouchEvent为主要的三类事件。在QTWebkit中,QWebPage::event(QEvent*)为事件分发方法。它定义了统一的分发接口。具体的分发细则由私有类QWebPagePrivate实现。
QWebPage::event(QEvent*)中处理的event非常多,详见下表。
Event Type |
|
Timer |
d->timerEvent |
MouseMove |
d->mouseMoveEvent |
MouseButtonPress |
d->mousePressEvent |
MouseButtonDblClick |
d->mouseDoubleClickEvent |
MouseButtonRelease |
d->mouseReleaseEvent |
ContextMenu |
d->contextMenuEvent |
Wheel |
d->wheelEvent |
KeyPress |
d->keyPressEvent |
KeyRelease |
d->keyReleaseEvent |
FocusIn |
d->focusInEvent |
FocusOut |
d->focusOutEvent |
DragEnter |
d->dragEnterEvent |
DragLeave |
d->dragLeaveEvent |
DragMove |
d->dragMoveEvent |
Drop |
d->dropEvent |
InputMethod |
d->inputMethodEvent |
TouchBegin |
d->touchEvent |
TouchUpdate |
d->touchEvent |
TouchEnd |
d->touchEvent |
注:d为QWebPagePrivate类型的对象。
通过阅读QWebPagePrivate的实现,可以发现,事件的处理均是由类EventHandler的handleXXXX实现的。类EventHandler是webkit的事件处理器,所以,若要改变webkit的事件处理规则可以修改该类。
实际上,Ekioh也是类似的事件处理方法。
EventHandler使用PlatformXXXXEvent来描述相关的XXXXEvent,所以,需要将QXXXXEvent转化为对应的PlatformXXXXEvent。
根据在Ekioh上的经验,一个事件由驱动抛出,交给window server系统。Window server系统会按照自己的定义,把事件封装,然后,交给browser应用。Browser应用则把window server的事件type转化成webkit需要的PlatformXXXXEvent,交给webkit处理。
Keydown事件的处理流程是需要注意的。它是先dispatch给Editor,然后再dispatch给DOM。Webkit中的解释是:”Run input method in advance of DOM event handling. This behaviour is necessary in order to match IE.”
WTF!!
如果要处理inputmethod,则修改EditorClientQT。
PageClients
在ekioh中好像还没有这个类。Page需要的clients通常直接以构造参数的方式传给Page。
从设计模式上看,Page和Page Clients间应用的是策略模式。
Page Clients分别为:
l ChromeClient
l ContextMenuClient
l EditorClient
l DragClient
l InspectorClient
l DeviceOrientationClient – 编译选项DEVICE_ORIENTATION控制
l DeviceMotionClient - 编译选项CLIENT_BASED_GEOLOCATION控制
l GeolocationClient - 编译选项CLIENT_BASED_GEOLOCATION控制
qt的page clients的实现位于目录webkit/qt/WebCoreSupport。
QWebFrame
QWebFrame代表web page中的一个frame。一个web page至少包含一个main frame。其它frame可以由<frame>或<iframe>标签创建。
遍历DOM树的方法
DOM树遍历与操作 |
|
documentElement |
返回DOM树的根节点 |
findAllElements, findFirstElement |
返回满足条件的元素 |
load,setHtml, setContent |
|
toHtml, toPlainText |
|
frameName |
|
title, url, baseUrl, icon |
|
|
|
QWebFrame的RenderLayer种类
RenderLayer |
|
ContentsLayer |
|
ScrollBarLayer |
|
PanIconLayer |
|
AllLayers |
|
QWebHistory
QWebSettings
QWebSettings类用于存储QWebPage和QWebFrame使用的配置信息。
每一个QWebPage对象都有一个属于它的QWebSettings对象。该QWebSettings对象对该page进行配置。
QWebElement
QWebElement类提供了便捷访问DOM元素的方法。DOM树的根是document元素,可以使用方法QWebFrame::documentElement()访问。
访问特定元素的方法:
findAll()或findFirst()
遍历文档也可以用firstChild()和nextSibling()。
DOM接口 |
|
findAll, findFirst |
访问特定元素(由CSS选择器指定) |
firstChild, nextSibling, lastChild previousSibling |
|
attribute, setAttribute |
查询或修改元素 |
hasAttribute, hasAttributeNS, |
|
removeAttribute |
|
hasFocus, setFocus |
|
tagName |
|
parent |
|
QWebElement遍历DOM树的实现依赖于类Element,遍历工作均由Element完成。