发布时间:2022-08-09 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

QTWebkit中的webkit/qt/api文档

QTWebkit中的webkit/qt/api文档

概述

该目录下的文件均以前前缀qweb开头,主要用于支持前端的实现。核心的类为:qwebview、qwebpage、qwebframe等三个类。这三者间的关系由图描述。(注:图来自QTWebkit自带文档)

QTWebkit中的webkit/qt/api文档  lotushy  博客园

图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完成。