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