天天看點

[Qt教程] 第40篇 網絡(十)WebKit初識 [Qt教程] 第40篇 網絡(十)WebKit初識

<a target="_blank" href="http://bbs.qter.org/forum.php?mod=viewthread&amp;tid=691">樓主</a>

[Qt教程] 第40篇 網絡(十)WebKit初識 [Qt教程] 第40篇 網絡(十)WebKit初識

 發表于 2013-9-11 17:26:05 | 檢視:

521| 回複: 10

webkit初識

版權聲明

該文章原創于作者yafeilinux,轉載請注明出處!

導語

webkit是一個開源的浏覽器引擎。qt中提供了基于webkit的qtwebkit子產品,它包含了一組相關的類。qtwebkit提供了一個web浏覽器引擎,使用它便可以很容易的将網際網路(worldwide web)中的内容嵌入到qt應用程式中。與此同時,本地也可以對web内容進行控制。qtwebkit可以呈現html(hypertextmarkup

language,超文本标記語言)文檔、xhtml(extensible hypertextmarkup language,可擴充超文本标記語言)文檔和svg(scalable vectorgraphics,可縮放矢量圖形)文檔,風格使用css(cascading stylesheets,層疊樣式表),腳本使用javascript。在javascript執行環境和qt對象模型間搭建的橋梁,實作了使用webkit的javascript環境通路本地對象。關于這一點,大家可以在幫助中參考the qtwebkit

bridge關鍵字對應的文檔。通過整合qt的網絡子產品,實作了從web伺服器、本地檔案系統甚至qt資源系統中透明的加載web頁面。

環境:windows xp + qt 4.8.5+qt creator2.8.0

目錄

一、簡單應用

二、擴充應用

正文

下面我們來實作一個可以打開特定網頁的程式。建立空的qt項目,在pro項目檔案中添加一行代碼:qt

+= webkit,然後向項目中添加一個main.cpp檔案,并在其中添加如下代碼:

#include &lt;qwebview&gt;

#include &lt;qapplication&gt;

int main(int

argc, char* argv[])

{

    qapplication a(argc, argv);

    qwebview view;

    view.load(qurl("http://www.qter.org"));

    view.show();

    return a.exec();

}

       要使用webkit,就要先添加webkit子產品。qwebview是qtwebkit子產品主要的窗體部件,它可以在各種應用程式中用來顯示internet上的網頁内容。qwebview作為一個視窗部件,可以嵌入到窗體或者圖形視圖部件中。

qwebview用來顯示web頁面,每個qwebview執行個體都包含一個qwebpage對象。qwebpage提供了對一個頁面的文檔結構的通路,描述了如架構(frame)、通路曆史記錄和可編輯内容的撤銷/重做棧等特色。每一個qwebpage都包含一個qwebframe對象作為它的主架構。在html中的每一個單獨的架構都可以使用qwebframe來表示,這個類包含了到javascript視窗對象的橋梁,而且可以進行繪制。在qwebpage的主架構中可以包含很多的子架構。

html文檔中單獨的元素可以通過dom javascript接口進行通路,在qtwebkit中與這個接口等價的接口由qwebelement來表示。qwebelement對象可以使用qwebframe的findallelement()和findfirstelement()函數來擷取。一般的網頁浏覽器的特色設定都可以通過qwebsettings類來配置,可以通過預設設定為所有的qwebpage執行個體提供預設值。單獨的屬性可以使用頁面指定的設定對象進行重寫。

下面再來看一個可以随意更改網址并且可以顯示網站logo的例子。建立qt gui應用,項目名稱為“webview”,類名和基類保持“mainwindow”和“qmainwindow”不變。完成後向webview.pro檔案中添加qt += webkit一行代碼,并按下ctrl + s儲存該檔案。

1.下面到mainwindow.h檔案中,先添加頭檔案:

#include &lt;qlineedit&gt;

然後添加槽的聲明:

protected slots:

    void changelocation(); 

   // 改變路徑

    void setprogress(int); 

   // 更新進度

    void adjusttitle(); 

      // 更新标題顯示

void finishloading(bool);  // 加載完成後進行處理

       再添加對象和變量定義:

qwebview *view;

qlineedit *locationedit;

int progress;

2.下面到mainwindow.cpp檔案中,在構造函數中添加如下代碼:

progress = 0;

view = new qwebview(this);

setcentralwidget(view);

resize(800, 600);

// 關聯信号和槽

connect(view, signal(loadprogress(int)), this, slot(setprogress(int)));

connect(view, signal(titlechanged(qstring)), this, slot(adjusttitle()));

connect(view, signal(loadfinished(bool)), this, slot(finishloading(bool)));

locationedit = new qlineedit(this);

connect(locationedit, signal(returnpressed()), this, slot(changelocation()));

// 向工具欄添加動作和部件

ui-&gt;maintoolbar-&gt;addaction(view-&gt;pageaction(qwebpage::back));

ui-&gt;maintoolbar-&gt;addaction(view-&gt;pageaction(qwebpage::forward));

ui-&gt;maintoolbar-&gt;addaction(view-&gt;pageaction(qwebpage::reload));

ui-&gt;maintoolbar-&gt;addaction(view-&gt;pageaction(qwebpage::stop));

ui-&gt;maintoolbar-&gt;addwidget(locationedit);

// 設定并加載初始網頁位址

locationedit-&gt;settext("http://www.baidu.com");

view-&gt;load(qurl("http://www.baidu.com"));

複制代碼

       當qwebview開始加載時,會發射loadstarted()信号;而每當一個網頁元素(例如一張圖檔或一個腳本等)加載完成時,都會發射loadprogress()信号;最後,當加載全部完成後,會發射loadfinished()信号,如果加載成功,該函數的參數為true,否則為false。可以使用title()來擷取html文檔的标題,如果标題發生了改變,将會發射titlechanged()信号。

3.下面添加那幾個槽的定義:

void mainwindow::changelocation()

    qurl url = qurl(locationedit-&gt;text());

    view-&gt;load(url);

    view-&gt;setfocus();

void mainwindow::setprogress(int

p)

    progress = p;

    adjusttitle();

void mainwindow::adjusttitle()

    if ( progress &lt;= 0 || progress &gt;= 100) {

       setwindowtitle(view-&gt;title());

    } else {

setwindowtitle(qstring("%1 (%2%)").arg(view-&gt;title()).arg(progress));

    }

void mainwindow::finishloading(bool

finished)

    if (finished) {

       progress = 100;

       setwindowtitle("web

page loading error!");

       下面運作程式,效果如下圖所示:

[Qt教程] 第40篇 網絡(十)WebKit初識 [Qt教程] 第40篇 網絡(十)WebKit初識

結語

webkit是一個很龐大的體系,我們這裡隻是講解了其最基本的應用,有興趣的朋友可以結合qt文檔來進一步的學習。

涉及到的代碼: 

[Qt教程] 第40篇 網絡(十)WebKit初識 [Qt教程] 第40篇 網絡(十)WebKit初識

bytes, 下載下傳次數: 3) 

[Qt教程] 第40篇 網絡(十)WebKit初識 [Qt教程] 第40篇 網絡(十)WebKit初識

kb, 下載下傳次數: 5) 

繼續閱讀