成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Qt Webkit中瀏覽器插件設計

移動開發
Qt Webkit中瀏覽器插件設計是本文要介紹對內容,我們都知道瀏覽器中有一套由Netscape瀏覽器傳承下來的插件接口,

Qt Webkit瀏覽器插件設計是本文要介紹對內容,我們都知道瀏覽器中有一套由Netscape瀏覽器傳承下來的插件接口,包括webkit,firefox都是支持的,但是那個開發起來比較困難,并且是平臺相關的,借助于Qt的跨平臺的特性,可以方便地為Qt開發出一套跨平臺的插件。

Qt Webkit中插件可以有兩種,一種Mime必須是application/x-qt-plugin或者application/x-qt-styled-widget,而另外一種則無需固定,可以是除了前面的兩種以外任意其它Mime類型。

前一種相對來說開發起來比較容易,只需重新實現

  1. QObject * QWebPage::createPlugin ( const QString & classid, const QUrl & url, const QStringList & paramNames, const QStringList &paramValues )  

這個函數即可,這個函數會把HTML文件中的參數都傳遞進來

下面是一個例子:

  1. class PluginPage : public QWContainer(wid2, wid3)ebPage   
  2. {   
  3. public:   
  4. PluginPage(QObject *parent = 0)   
  5.  
  6. : QWebPage(parent) {}   
  7. protected:   
  8. virtual QObject *createPlugin(const QString &classid, const QUrl &url,   
  9. const QStringList &paramNames,   
  10. const QStringList &paramValues)   
  11. {   
  12. QObject *result = 0;   
  13. if (classid == "pushbutton")   
  14. result = new QPushButton();   
  15. else if (classid == "lineedit")   
  16. result = new QLineEdit();   
  17. if (result)   
  18. result->setObjectName(classid);   
  19. //可以進行一些處理   
  20. return result;   
  21. }   
  22. };  

這樣下面的網頁就可以一個pushbutton了:

  1. <html><body><object type='application/x-qt-plugin' classid='pushbutton' id='mybutton'/></body></html>  

并且還可以在JavaScript訪問到QPushbutton,例如:

document.getElementById('mybutton').text將會返回按鈕上的字符串。

上面介紹的插件設計方式中雖然方便,但是其Mime類型只能是application/x-qt-plugin或者application/x-qt-styled-widget,這個有時候可能滿足不了實際應用需求,那么另一種就沒有這種限制,那可以是任意Mime類型的。這種設計需要重新實現QWebPluginFactory這個純虛基類。先看看他的聲明:

前一節介紹的插件設計方式中雖然方便,但是其Mime類型只能是application/x-qt-plugin或者application/x-qt-styled-widget,這個有時候可能滿足不了實際應用需求,那么另一種就沒有這種限制,那可以是任意Mime類型的。這種設計需要重新實現QWebPluginFactory這個純虛基類。先看看他的聲明:

  1. class QWEBKIT_EXPORT QWebPluginFactory : public QObject {   
  2. ……   
  3. public:   
  4. struct Plugin {   
  5. QString name;   
  6. QString description;   
  7. QList<MimeType> mimeTypes;   
  8. };   
  9. explicit QWebPluginFactory(QObject* parent = 0);   
  10. virtual ~QWebPluginFactory();   
  11. virtual QList<Plugin> plugins() const = 0;   
  12. virtual void refreshPlugins();   
  13. virtual QObject *create(const QString& mimeType,   
  14. const QUrl&,   
  15. const QStringList& argumentNames,   
  16. const QStringList& argumentValues) const = 0;   
  17.  
  18. virtual bool extension(Extension extension, const ExtensionOption* option = 0, ExtensionReturn* output = 0);   
  19. virtual bool supportsExtension(Extension extension) const;   
  20. ……   
  21. };  

重點要實現的接口是plugins,用于獲取plugin的列表,用于webkit內部判斷該mime類型是否被支持,如果可以支持,那么就會調用create來創建這個插件,而具體打開哪個文件以及參數都會傳遞進來。

后兩個extension和supportsExtension接口暫時沒有發現有什么用處,暫不考慮。

因此重新實現的WebPluginFactory如下:

  1. class WebPluginFactory: public QWebPluginFactory   
  2. {   
  3.     public:   
  4.         WebPluginFactory(QObject *parent = 0);   
  5.         ~WebPluginFactory(){};   
  6.         QList<QWebPluginFactory::Plugin> plugins()const ;   
  7.         void refreshPlugins();   
  8.         QObject *create(const QString &mimeType,   
  9.                 const QUrl &url,   
  10.                 const QStringList &argumentNames,   
  11.                 const QStringList &argumentValues) const ;   
  12.         bool extension(QWebPluginFactory::Extension extension, const QWebPluginFactory::ExtensionOption 
  13. *option = 0, QWebPluginFactory::ExtensionReturn *output = 0);   
  14.         bool supportsExtension(QWebPluginFactory::Extension extension) const;   
  15.     private:   
  16.         // 用于將載入的插件記錄下來   
  17.         mutable QList<QList<QWebPluginFactory::Plugin> > pluginslist;   
  18.         mutable QList<WebKitPluginInteface *> interfaces;   
  19. };  

具體實現主要是create和plugins兩個函數:

  1. QList<QWebPluginFactory::Plugin> WebPluginFactory::plugins() const   
  2. {   
  3.     const char * s=getenv("BROWSER_PLUGIN_DIR");   
  4.     static bool isFirst=true;   
  5.     if(!isFirst)   
  6.     {   
  7.         return pluginslist;   
  8.     }   
  9.     isFirst=false;   
  10.     QString spath;   
  11.     if(s)   
  12.     sspath=s;   
  13.     else   
  14. {   
  15. spath=".";   
  16. }   
  17.     QDir dir(spath);   
  18.     QStringList filters;   
  19.     QString abspath=dir.absolutePath();   
  20. filters<<"libqtweb*.so"; //查找下面的擴張,linux下是so,windows下則應該是dll,   
  21.     QStringList files=dir.entryList(filters);   
  22.     foreach(QString file,files)   
  23.     {   
  24.         file=dir.filePath(file);   
  25.         QPluginLoader loader(file,0);   
  26.         QObject * objloader.instance();   
  27. //下面是載入自定義的接口,只有這樣才能支持動態插件創建,如果固定死了,將不利于擴展,后一節會介紹這部分內容   
  28.         WebKitPluginInteface * interfaceqobject_cast<WebKitPluginInteface*> (obj);   
  29.         if(interface==0)   
  30.         {   
  31.             //ignore error when loading so ;   
  32.             continue;   
  33.         }   
  34.         interface->plugins();   
  35.         plugins.append(interface->plugins());   
  36.         pluginslist.append(interface->plugins());   
  37.         interfaces.append(interface);   
  38.     }   
  39.     return plugins;   
  40. }   
  41.  
  42. void WebPluginFactory::refreshPlugins()   
  43. {   
  44.     Reload();   
  45. }   
  46.  
  47. QObject * WebPluginFactory::create(const QString &mimeType,   
  48.         const QUrl &url,   
  49.         const QStringList &argumentNames,   
  50.         const QStringList &argumentValues) const   
  51. {   
  52.     for(int i=0;i<pluginslist.size();i++)   
  53.     {   
  54.         for( int j=0;j< pluginslist[i].size();j++)   
  55.         {   
  56.             foreach(WebPluginFactory::MimeType mt, pluginslist[i][j].mimeTypes)   
  57.             {   
  58.                 if(mt.name == mimeType) //查找到,創建實例   
  59.                     return interfaces[i]->create( mimeType, url, argumentNames, argumentValues);   
  60.             }   
  61.         }   
  62.     }   
  63.     return NULL; //如果沒有,直接返回NULL,webkit會進行處理的   
  64. }  

這兩個最主要的接口都是圍繞著mimetype進行的,通過返回的列表告訴webkit插件支持什么類型的文件,而create則根據mimetype來識別文件類型,然后創建相應的插件。

小結:Qt Webkit瀏覽器插件設計的內容介紹完了,希望通過Qt Webkit應用內容的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-08-29 14:19:48

QtWebkit瀏覽器

2011-08-29 14:27:33

QTWebkit瀏覽器

2010-07-21 15:06:33

2013-03-06 11:10:12

WebKit瀏覽器

2011-08-08 09:25:55

2013-10-31 14:31:09

2011-06-10 17:10:32

Qt GUI 瀏覽器

2009-11-11 13:00:05

GNOME瀏覽器Webkit內核

2011-09-09 17:39:58

WebKit瀏覽器

2010-04-28 10:39:43

Webkit瀏覽器內核

2011-06-10 16:44:17

Qt 瀏覽器

2013-11-22 09:58:36

2011-06-14 11:48:38

Webkit QT

2011-09-01 14:04:45

QT Webkit插件

2009-11-12 09:21:20

Chrome瀏覽器插件

2009-06-22 14:06:00

java瀏覽器

2011-09-01 15:22:16

Qt WebKitWebKit

2013-02-18 10:39:53

OperaWebkit瀏覽器

2010-01-21 09:02:51

搜狗瀏覽器Webkit

2012-03-20 11:41:18

海豚瀏覽器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人网视频 | 久久久久国产视频 | 中文字幕在线观看av | 亚洲一区国产精品 | 女生羞羞网站 | 国产精品久久一区 | 国产做爰 | 久久69精品久久久久久国产越南 | 午夜免费精品视频 | 亚洲一区播放 | 国产精品国产精品国产专区不蜜 | 在线观看黄色大片 | 欧美精品在线一区二区三区 | 欧美v在线观看 | 亚洲综合色丁香婷婷六月图片 | 久久久久久久av | 欧美色欧美亚洲另类七区 | 国产成人精品一区二区三区四区 | 日韩av一区二区在线观看 | 成年女人免费v片 | 国产精品揄拍一区二区久久国内亚洲精 | 不卡的av在线 | 久久久久久亚洲 | 99热最新 | 国产乱人伦精品一区二区 | 色婷婷久久久亚洲一区二区三区 | 黄页网址在线观看 | 91久久国产精品 | 成人午夜视频在线观看 | 国产精品免费一区二区三区四区 | 欧美三级久久久 | 一级视频黄色 | 狠狠的日| 免费在线一区二区 | 日韩一级免费大片 | 在线电影日韩 | 龙珠z国语版在线观看 | 日韩欧美精品在线 | 日本一二三区电影 | 99精品一区二区 | 一区二区精品在线 |