自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解基于Qt Webkit嵌入式BS架構設計

移動開發(fā)
基于QtWebkit嵌入式BS架構設計是本文要介紹的內容,主要介紹如何使用 QtWebkit 來實現(xiàn)嵌入式客戶端( browser ),而不關注 webkit 引擎的原理和任何效率問題。

基于Qt Webkit嵌入式BS架構設計是本文要介紹的內容,主要介紹如何使用 Qt Webkit 來實現(xiàn)嵌入式客戶端( browser ),而不關注 webkit 引擎的原理和任何效率問題。

重點關注如何使用遙控器去操作網(wǎng)頁中的元素(例如焦點移動,打開新的鏈接),這種應用在目前的 iptv 上應用非常廣泛,通過實現(xiàn)自己的 browser ,可以加載不同的風格的界面(即網(wǎng)頁),結合使用 qt 其他控件和 QtWebkit (框架)實現(xiàn)功能與界面***結合的產品。

一、嵌入式 BS 架構的優(yōu)勢

嵌入式 bs 架構的設計與 pc 上的 bs 架構的區(qū)別:

1、pc 上無須自行設計瀏覽器,嵌入式需要對瀏覽器進行特殊處理。(如按鍵等)

2、嵌入式需要加上對遙控器的支持。(如 tv 遙控器)

3、pc 上支持的網(wǎng)頁元素比嵌入式要多。

4、嵌入式需要做多套網(wǎng)頁以適應不同屏幕的分辨率。

5、嵌入式需要考慮 page cache 和 flash 權衡的問題。

bs 架構比 cs 架構的優(yōu)勢:

1、設計簡單。大部分界面和部分功能都在后臺服務器實現(xiàn)。

2、界面炫麗。使用網(wǎng)頁可以達到很炫的效果,顯示格式也非常好控制。

3、修改方便。基本上只需修改網(wǎng)頁就可以了。

4、可擴展性強。一個設計好的 browser 可以使用不同風格的網(wǎng)頁,如:加載 youku 看電影,加載土豆看電影(不過這比較困難,焦點通過遙控器的移動在網(wǎng)頁中鏈接,輸入框, button 之間是一個非常困難的過程,嵌入式 flash player 很少)。

二、QtWebkit 的優(yōu)勢以及使用

QtWebkit 只是一個瀏覽器框架,其核心引擎時 webkit , QtWebkit 簡單的歸納為 webkit 的顯示界面,即表現(xiàn)層和邏輯層的關系。 QtWebkit 的優(yōu)勢在于:

1、可移植性強。 Linux , windows , embedded linux 。

2、對 javascript 支持比較好。

3、對 css 支持比較全面。

4、封裝比較好,簡單易用。

需要用到 QtWebkit 時,需要在編譯 QT 源碼的時候,在 ./configure 加上 –webkit ,在編譯自己的應用程序時,需要在 .pro 文件加上 QT+=webkit ,或者直接改 Makefile 加上 -lQWebkit ,簡單的 browser 程序如下:

  1.        int main(int argc, char* argv[])   
  2. {   
  3.     QApplication app(argc,argv);   
  4.      QWebview *view = new QWebview ();   
  5.      view->setGeometry(0,0,1024,1000);   
  6.          view->load(QUrl("www.baidu.com"));   
  7.       view->show();   
  8.          return app.exec();   
  9. }  

3、通過鍵盤(遙控器)控制網(wǎng)頁元素

通過使用 QWebview , QWebFrame , QWebPage 類就基本上可以實現(xiàn)瀏覽器的所有功能,而我們重點關注是 QWebElement 這個類,該類封裝了網(wǎng)頁中 element ,即每個 <a></a> 就是一個 QWebElement 對象,不僅僅局限于 <a/>,<b/>,<head/> 等等都是一個 QWebElement ,而我們要通過遙控控制焦點的移動就需要調用 element.focus()( 注: qt 4.6 以后才有這個方法 ) 。

舉例說明:

需求 : 通過上下左右鍵來移動 baidu 中鏈接(即 <a> 元素),并改變相應鏈接的顏色。

實現(xiàn)分析:利用 QWebview 加載 baidu ,然后將 <a> 標簽全部提取出來,放在 QWebElement list 中,(注:需要加載網(wǎng)頁成功后才開始提取,否則會出現(xiàn)提取不到。即當 emit   signal loadFinished(bool) 后才開始提?。?。

重寫 QWebview 的 keyPressEvent 函數(shù), QWebview 默認的上下左右鍵是當網(wǎng)頁顯示不下時滾動的處理,這點可通過源碼以及默認的處理看出來,但可以通過 tab 鍵實現(xiàn)焦點移動,當收到上下左右鍵時可通過把按鍵事件改為 Qt :: Key_Tab 鍵事件來實現(xiàn)焦點移動(示例程序不是通過這種方法)。

改變相應鏈接的顏色有很多方法,暫列舉 2 種:

1、當焦點挪動時恢復原聚焦的元素的 style ,給現(xiàn)聚焦的元素加上新的 style 。

2、自寫一個通明控件,當焦點聚焦時將改空間放在元素對應的位置。

代碼:

  1. #include "browser.h"   
  2. #include <stdio.h>   
  3. browser::browser(QWidget * parent/* = 0 */):QWebView(parent)   
  4.  
  5. {   
  6.     focusIndex = 0;   
  7.     frame=this->page()->currentFrame();   
  8.     frame->setScrollBarPolicy(Qt::Horizontal ,Qt::ScrollBarAlwaysOff);   
  9.     frame->setScrollBarPolicy(Qt::Vertical ,Qt::ScrollBarAlwaysOff);   
  10.     connect(this,SIGNAL(loadFinished(bool)),this,SLOT(loadPageFinish(bool)));   
  11.  
  12. /* set webview no transparent */   
  13.        QPalette palette(QColor(255,0,0));   
  14.        this->setPalette(palette);  
  15.        this->setAttribute(Qt::WA_OpaquePaintEvent, false);   
  16. }   
  17. browser::~browser()   
  18. {   
  19. }   
  20. QString ed = "";   
  21. void browser::loadPageFinish(bool finish)   
  22. {   
  23.     if (finish)   
  24.     {   
  25.         focusIndex = 0;   
  26.         QWebFrame  *frame=this->page()->currentFrame();   
  27.         QWebElement  document=frame->documentElement();   
  28.         //printf("%s%s/n",ed.toLocal8Bit().data(),document.tagName().toLocal8Bit().data());   
  29.         //examineChildElements(document);   
  30.        elementList.clear();   
  31.         elementList = document.findAll("a").toList();   
  32.         if (elementList.size() > focusIndex)   
  33.         {   
  34.             QWebElement element;   
  35.             element = elementList.at(focusIndex);   
  36.             if (element.hasAttribute("style"))   
  37.             {   
  38.                 preFocusStyle = element.attribute("style","");   
  39.             }   
  40.             element.setFocus();   
  41.             element.setAttribute("style", "background-color: #ff0000");   
  42.         }   
  43.     }   
  44.        /* set page transparent,so we can see view's background*/   
  45.        QPalette palette = this->palette();   
  46.        palette.setBrush(QPalette::Base, Qt::transparent);   
  47.        this->page()->setPalette(palette);   
  48. }   
  49. void browser::examineChildElements(const QWebElement &parentElement)   
  50. {   
  51.     ed += "  ";   
  52.     QWebElement element = parentElement.firstChild();   
  53.      while (!element.isNull())   
  54.     {   
  55.         printf("%s%s/n",ed.toLocal8Bit().data(),element.tagName().toLocal8Bit().data());   
  56.         if (element.hasFocus())   
  57.         {   
  58.             qDebug()<<element.tagName()<<"==============>";   
  59.         }   
  60.         if (element.toPlainText() == QString("hao123"))   
  61.         {   
  62.             element.setAttribute("style", "background-color: #ff0000");   
  63.             element.setFocus();   
  64.         };   
  65.         examineChildElements(element);   
  66.         if (ed.length()> 2)   
  67.         {   
  68.             ed.remove(0,2);   
  69.         }   
  70.         elementelement = element.nextSibling();   
  71.     }   
  72. }   
  73. void browser::keyPressEvent(QKeyEvent * ev)   
  74. {   
  75.     switch (ev->key())   
  76.     {   
  77.         case Qt::Key_Right:   
  78.         case Qt::Key_Left:   
  79.         {   
  80.             if (elementList.size() > focusIndex)   
  81.             {   
  82.                 QWebElement element = elementList.at(focusIndex);   
  83.                 if (!element.isNull())   
  84.                 {   
  85.                     if (element.hasAttribute("style"))   
  86.                     {   
  87.                          element.setAttribute("style", preFocusStyle);   
  88.                     }   
  89.                     focusIndex += 1;   
  90.                     if (elementList.size() == focusIndex)   
  91.                         focusIndex = 0;   
  92.                     element = elementList.at(focusIndex);   
  93.                     if (element.hasAttribute("style"))   
  94.                     {   
  95.                         preFocusStyle = element.attribute("style","");   
  96.                     }   
  97.                     element.setFocus();   
  98.                     element.setAttribute("style", "background-color: #ff0000");   
  99. //                     QLabel* label = new QLabel(this);   
  100. //                     label->setGeometry(element.geometry());   
  101. //                     label->setText("i am focus");   
  102. //                     label->show();   
  103. //                     label->raise();   
  104.                 }   
  105.             }   
  106.         }   
  107.         break;   
  108.         default:   
  109. QWebView::keyPressEvent(ev);   
  110. }   
  111. }  

總結:上述程序只能左移到上一個鏈接或者右移到下一個鏈接,這種控制焦點的方式在簡單的幾個鏈接的網(wǎng)頁比較合適,在需要精確的控制焦點移動時,***通過網(wǎng)頁本身去做(如調用 js 腳本等), QWebview 調用 js 腳本以及與 js 通信的示例資料網(wǎng)上很多,這里不做陳述。

小結:詳解基于Qt Webkit嵌入式BS架構設計的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關推薦

2011-09-06 11:25:08

2011-06-21 11:10:28

Qt Embedded

2011-07-05 15:42:02

QT 嵌入式 Embedded

2011-07-05 15:59:18

Qt 嵌入式 linux

2011-06-13 14:00:55

Qt Designer linux

2009-12-09 10:50:53

嵌入式Linux

2011-06-14 11:48:38

Webkit QT

2009-12-24 17:21:38

嵌入式Linux

2009-05-27 19:28:20

Linux磁場設計

2014-05-26 15:14:04

DIGIA嵌入式Qt

2022-12-14 08:06:08

2023-01-04 09:37:16

2011-06-09 10:28:54

QT 嵌入式

2011-06-21 11:30:31

嵌入式 Qt

2009-12-23 10:33:30

Silverlight

2013-01-21 10:26:13

2009-12-22 17:46:56

Fedora 9嵌入式

2011-08-29 14:10:03

QtWebkitFlash

2023-11-29 07:51:40

嵌入式軟件設計

2023-07-16 22:48:59

點贊
收藏

51CTO技術棧公眾號