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

Qt Webkit中瀏覽器插件設計實現(xiàn)

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

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

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

前一種相對來說開發(fā)起來比較容易,只需重新實現(xiàn)

  1. QObject * QWebPage::createPlugin (   
  2. const QString   
  3. & classid, const QUrl   
  4. & url, const QStringList   
  5. & paramNames, const QStringList &paramValues   

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

下面是一個例子:

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

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

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

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

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

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

前一節(jié)介紹的插件設計方式中雖然方便,但是其Mime類型只能是application/x-qt-plugin或者application/x-qt-styled-widget,這個有時候可能滿足不了實際應用需求,那么另一種就沒有這種限制,那可以是任意Mime類型的。這種設計需要重新實現(xiàn)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. virtual bool extension(Extension extension, const ExtensionOption* option = 0, ExtensionReturn* output = 0);  
  18. virtual bool supportsExtension(Extension extension) const;  
  19. ……  
  20. }; 

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

后兩個extension和supportsExtension接口暫時沒有發(fā)現(xiàn)有什么用處,暫不考慮。

因此重新實現(xiàn)的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 *option = 0
  13. 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. }; 

具體實現(xiàn)主要是create和plugins兩個函數(shù):

  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. //下面是載入自定義的接口,只有這樣才能支持動態(tài)插件創(chuàng)建,如果固定死了,將不利于擴展,后一節(jié)會介紹這部分內容  
  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. void WebPluginFactory::refreshPlugins()  
  42. {  
  43.     Reload();  
  44. }  
  45. QObject * WebPluginFactory::create(const QString &mimeType,  
  46.         const QUrl &url,  
  47.         const QStringList &argumentNames,  
  48.         const QStringList &argumentValues) const  
  49. {  
  50.     for(int i=0;i<pluginslist.size();i++)  
  51.     {  
  52.         for( int j=0;j< pluginslist[i].size();j++)  
  53.         {  
  54.             foreach(WebPluginFactory::MimeType mt, pluginslist[i][j].mimeTypes)  
  55.             {  
  56.                 if(mt.name == mimeType) //查找到,創(chuàng)建實例  
  57.                     return interfaces[i]->create( mimeType, url, argumentNames, argumentValues);  
  58.             }  
  59.         }  
  60.     }  
  61.     return NULL; //如果沒有,直接返回NULL,webkit會進行處理的  

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

下一節(jié)會簡單的創(chuàng)建一個插件來演示如何創(chuàng)建一個插件。

上一篇講到可以通過擴展QWebPage接口進行動態(tài)載入插件,但是插件的接口并沒有明確,這一篇通過介紹自定義的接口來實現(xiàn)插件的動態(tài)載入。

首先是接口的定義:

  1. class WebKitPluginInteface  
  2. {  
  3.     public:  
  4.         virtual ~WebKitPluginInteface(){};  
  5.         virtual QList<QWebPluginFactory::Plugin> plugins()const =0;  
  6.         virtual QObject *create(const QString &mimeType,  
  7.                 const QUrl &url,  
  8.                 const QStringList &argumentNames,  
  9.                 const QStringList &argumentValues) const =0;  
  10. };  
  11.  
  12. Q_DECLARE_INTERFACE(WebKitPluginInteface, "baizx.cnblogs.com/1.0") 

這樣自定義的插件就可以通過實現(xiàn)這個接口來實現(xiàn)定制的插件。下面是一個例子:

  1. class TestPlugin :public QObject,public WebKitPluginInteface  
  2. {  
  3. Q_OBJECT  
  4. Q_INTERFACES(WebKitPluginInteface)  
  5.     public:  
  6.         TestPlugin(QObject * parent=0): WebkitPlugin(parent){};  
  7.         virtual ~TestPlugin(){};  
  8.         virtual QList<QWebPluginFactory::Plugin> plugins()const ;  
  9.         virtual QObject *create(const QString &mimeType,  
  10.                 const QUrl &url,  
  11.                 const QStringList &argumentNames,  
  12.                 const QStringList &argumentValues) const ;  
  13. };  
  14.  
  15. QList<QWebPluginFactory::Plugin> TestPlugin::plugins()const  
  16. {  
  17.     QList<QWebPluginFactory::Plugin> plugins ;  
  18.     QWebPluginFactory::Plugin plugin;  
  19.     QWebPluginFactory::MimeType mimeType;  
  20.     QStringList strings;  
  21.     plugin.name="testplugin";  
  22.     plugin.description="testplugin !!!";  
  23.     mimeType.name="application/x-textedit";  
  24.     mimeType.description="test textedit";  
  25.     strings.append(".etxt");  
  26.     mimeType.fileExtensions=strings;  
  27.     QList<QWebPluginFactory::MimeType> mimeTypes;  
  28.     mimeTypes.append(mimeType);  
  29.     plugin.mimeTypes=mimeTypes;  
  30.     plugins.append(plugin);  
  31.     return plugins;  
  32. }  
  33.  
  34. QObject *TestPlugin::create(const QString &mimeType,  
  35.                 const QUrl &url,  
  36.                 const QStringList &argumentNames,  
  37.                 const QStringList &argumentValues) const  
  38. {  
  39.     QTextEdit * editnew QTextEdit();  
  40. edit->setObjectName("我是插件");  
  41.     edit->setPlainText(mimeType + url.toString() );  
  42.     Q_UNUSED(argumentNames);  
  43.     Q_UNUSED(argumentValues);  
  44.     return edit;  

這樣一個簡單的插件就創(chuàng)建完畢了,具體實際應用中可能會用到很到參數(shù),并且會載入實際的內容,這里只是一個演示。

小結:Qt Webkit瀏覽器插件設計實現(xiàn)的內容介紹完了,希望通過本文的學習能對你有所幫助!

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

2011-09-09 18:43:13

Qt Webkit瀏覽器

2011-08-29 14:27:33

QTWebkit瀏覽器

2010-07-21 15:06:33

2011-06-10 17:10:32

Qt GUI 瀏覽器

2011-09-01 14:04:45

QT Webkit插件

2013-03-06 11:10:12

WebKit瀏覽器

2011-08-08 09:25:55

2013-10-31 14:31:09

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

2016-09-21 14:24:37

3D全景瀏覽器瀏覽器

2009-11-12 09:21:20

Chrome瀏覽器插件

2011-09-01 15:22:16

Qt WebKitWebKit

2009-06-22 14:06:00

java瀏覽器

2013-02-18 10:39:53

OperaWebkit瀏覽器

2010-01-21 09:02:51

搜狗瀏覽器Webkit
點贊
收藏

51CTO技術棧公眾號