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

詳解為QT Webkit編寫插件案例實現(xiàn)

移動開發(fā)
為QT Webkit編寫插件案例實現(xiàn)是本文要介紹的內(nèi)容,主要是來了解QT Webki中的插件問題,為了允許的QWebView加載插件,必須使能QWebView的Javascript和Plugins屬性。

QT Webkit編寫插件案例實現(xiàn)是本文要介紹的內(nèi)容,主要是來了解QT Webkit中的插件問題,為了允許的QWebView加載插件,必須使能QWebView的Javascript和Plugins屬性,使能方法為:

  1. QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptEnabled,true);  
  2. QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled,true); 

或者

//這里假設(shè)webView是QWebView的對象:

  1. QWebView *webView;webView->settings()->setAttribute(QWebSettings::JavascriptEnabled,true);  
  2. webView->settings()->setAttribute(QWebSettings::PluginsEnabled,true); 

然后為QWebView添加插件工廠,這個插件工廠中包含了QWebView中所有可用的插件庫,當(dāng)然這個插件工廠中包含哪些插件得由我們程序員來定。添加插件工廠的方法為:
//為QWebView添加插件工廠,即告訴QWebView有哪些插件可用。//這里的 WebkitPluginFactory 是Qt的虛類 QWebPluginFactory 的實現(xiàn)類,后面會講到這個類。

  1. webView->page()->setPluginFactory(new WebkitPluginFactory(this)); 

下面我們就來實現(xiàn)這個插件工廠類WebkitPluginFactory, 主要需要實現(xiàn)的就是 QWebPluginFactory  中的兩個虛函數(shù):

  1. virtual QObject *create(  
  2.   const QString &mimeType,   
  3.   const QUrl &url,         
  4.   const QStringList &argumentNames,  
  5.   const QStringList & argumentValues )  
  6.   const = 0;virtual QList<Plugin>      
  7.   plugins () const = 0;  
  8.     
  9. plugins() 方法為獲取所有可用的插件列表, create() 方法則根據(jù)mimeType等參數(shù)來決定創(chuàng)建相應(yīng)的插件。下面給出這個類的實現(xiàn)代碼:  
  10.  
  11. webkitpluginfactory.h :  
  12.  
  13. #ifndef WEBKITPLUGINFACTORY_H  
  14. #define WEBKITPLUGINFACTORY_H   
  15. #include <QWebPluginFactory> 
  16. #include <QUrl> 
  17. #include "webkitplugininterface.h" class WebkitPluginFactory : public QWebPluginFactory{    
  18.   Q_OBJECTpublic:    WebkitPluginFactory(QObject *parent = 0);      
  19.   QObject *create (   
  20.     const QString & mimeType, const QUrl & url,   
  21.     const QStringList & argumentNames, const QStringList & argumentValues )   
  22.     const;    QList<QWebPluginFactory::Plugin> plugins () const;   
  23.   private:    // 插件列表    mutable QList<QList<QWebPluginFactory::Plugin> > pluginslist;    
  24. //插件接口,這個接口是我們自定義的插件的同意接口。    //這個接口在后面會講到。    
  25. mutable QList<WebKitPluginInterface *> interfaces;  
  26.  };   
  27.  #endif // WEBKITPLUGINFACTORY_H  
  28.    
  29. webkitpluginfactory.cpp :  
  30.  
  31. #include "webkitpluginfactory.h"  
  32. #include <QPluginLoader>   
  33. #include <QDebug> 
  34. #include <QDir>    
  35. WebkitPluginFactory::WebkitPluginFactory(QObject *parent) :          
  36.     QWebPluginFactory(){      
  37.         qDebug()<<"debug : WebkitPluginFactory";  
  38.      }   
  39.    QList<QWebPluginFactory::Plugin>   
  40.    WebkitPluginFactory::plugins () const{       
  41.    //const char * s=getenv("BROWSER_PLUGIN_DIR");      
  42.      const char *s = "/home/nxx/FlashPlugin-build-desktop";      
  43.      static bool isFirst=true;      
  44.      static QList<QWebPluginFactory::Plugin> plugins;      
  45.        if(!isFirst)    {     
  46.             return plugins;      
  47.    }      
  48.    isFirst=false;      
  49.    plugins.clear();       
  50.    QString spath;      
  51.    if(s)        sspath=s;      
  52.    else        spath=".";       
  53.    QDir dir(spath);      
  54.    QStringList filters;      
  55.    QString abspath=dir.absolutePath();      
  56.    qDebug()<<abspath;     //獲取指定目錄下的所有插件,linux下是插件庫的后綴為so,windows下則是dll  
  57.    filters<<"lib*.so";      
  58.    QStringList files=dir.entryList(filters);      
  59.    qDebug()<<"files: "<<files;    foreach(QString file,files)    {     
  60.         qDebug()<<QLibrary::isLibrary(file);          
  61.         file=dir.filePath(file);          
  62.         qDebug()<<"path: "<<file;          
  63.         QPluginLoader loader(file);          
  64.         QObject * objloader.instance();          
  65.         if(obj==0)              
  66.         qDebug()<<"error: "<<loader.errorString();          
  67.         //下面是載入自定義的接口,只有這樣才能支持動態(tài)插件創(chuàng)建,如果固定死了,將不利于擴展          
  68.     WebKitPluginInterface * interfaceqobject_cast<WebKitPluginInterface*> (obj);          
  69.     if(interface==0)        {     
  70.              qDebug()<<"ignore error when loading so" ;             
  71.               continue;          
  72.          }          
  73.    qDebug()<<"load plugins: "<<interface->plugins().at(0).name;          
  74.    plugins.append(interface->plugins());         
  75.     pluginslist.append(interface->plugins());          
  76.     interfaces.append(interface);     
  77.  }    if(plugins.isEmpty()){         
  78.   qDebug()<<"no plugins is loaded!";     
  79.    }      
  80.  return plugins;  
  81. }  QObject * WebkitPluginFactory::create (   
  82. const QString & mimeType,   
  83. const QUrl & url, const QStringList & argumentNames, const QStringList & argumentValues )   
  84. const{      
  85. for(int i=0;i<pluginslist.size();i++)    {     
  86.      for( int j=0;j< pluginslist[i].size();j++)        {         
  87.           foreach(QWebPluginFactory::MimeType mt, pluginslist[i][j].mimeTypes)   {       
  88.     if(mt.name == mimeType) //更具MIME類型,創(chuàng)建相應(yīng)的插件實例                   
  89.        return interfaces[i]->    
  90.     create( mimeType, url, argumentNames, argumentValues);            
  91.  }        
  92. }     
  93.  }      
  94.  return NULL; //如果沒有,直接返回NULL,webkit會進行處理的  

下面就可以開始編寫插件庫。首先我們定義插件的統(tǒng)一接口,然后每個插件類只需實現(xiàn)該接口就行了,這樣有利于擴展插件庫。

自定義的插件接口:

  1. webkitplugininterface.h :  
  2.  
  3. #ifndef WEBKITPLUGININTERFACE_H  
  4. #define WEBKITPLUGININTERFACE_H  
  5. #include <QWebPluginFactory>   
  6. class WebKitPluginInterface{public:    virtual   
  7. WebKitPluginInterface(){};      
  8. virtual QList<QWebPluginFactory::Plugin> plugins()const =0;      
  9. virtual QObject *create(  
  10.            const QString &mimeType,     
  11.            const QUrl &url,    
  12.            const QStringList &argumentNames,   
  13.            const QStringList &argumentValues)   
  14.            const =0;}; //聲明WebKitPluginInterface為一個接口  
  15.    Q_DECLARE_INTERFACE(WebKitPluginInterface, "com.plugin.uvchip.www/1.0")  
  16.    #endif // WEBKITPLUGININTERFACE_H  

上面的那段代碼中的Q_DECLARE_INTERFACE() 是在定義接口是必須添加聲明。下面是Qt對這個宏的說明:

  1. Q_DECLARE_INTERFACE (   
  2. ClassName, Identifier )This macro associates the given Identifier (a string literal)   
  3. to the interface class called ClassName. The Identifier must be unique. 

下面我們開始實現(xiàn)這個接口:

我們將flashplugin編譯成庫,這樣就可以供插件工廠WebkitPluginFactory加載訪問了。

  1. flashplugin.h :  
  2.  
  3. #ifndef FLASHPLUGIN_H  
  4. #define FLASHPLUGIN_H   
  5. #if defined(FLASHPLUGIN_LIBRARY)  
  6. #  define FLASHPLUGINSHARED_EXPORT Q_DECL_EXPORT#else  
  7. #  define FLASHPLUGINSHARED_EXPORT Q_DECL_IMPORT#endif   
  8. #include "webkitplugininterface.h"  
  9. #include <QtPlugin>   
  10.     class FLASHPLUGINSHARED_EXPORT FlashPlugin : public QObject, public WebKitPluginInterface  {          
  11.     Q_OBJECT          
  12.     Q_INTERFACES(WebKitPluginInterface) //聲明WebKitPluginInterface是一個接口      
  13.     public:          
  14.     FlashPlugin(): WebKitPluginInterface(){};          
  15.     ~FlashPlugin(){};          
  16.     QList<QWebPluginFactory::Plugin> plugins()const ;         
  17.      QObject *create(const QString &mimeType,    
  18.      const QUrl &url,     
  19.      const QStringList &argumentNames,      
  20.      const QStringList &argumentValues) const ;   
  21.      };  
  22.  #endif // FLASHPLUGIN_H  
  23.    
  24. flashplugin.cpp :  
  25.  
  26. #include "flashplugin.h"   
  27. #include <QTextEdit> 
  28. #include <QUrl> 
  29. #include <QDebug>   
  30. QList<QWebPluginFactory::Plugin> FlashPlugin::plugins()const{      
  31. QWebPluginFactory::MimeType mimeType;      
  32. mimeType.name="application/x-shockwave-flash";      
  33. mimeType.description=QObject::tr("flash");      
  34. mimeType.fileExtensions.append(".flv");      
  35. mimeType.fileExtensions.append(".f4v");     
  36.  mimeType.fileExtensions.append(".swf");      
  37.   QList<QWebPluginFactory::MimeType> mimeTypes;      
  38.   mimeTypes.append(mimeType);       
  39.   QWebPluginFactory::Plugin plugin;      
  40.   plugin.name=QObject::tr("External Video viewer plugin");      
  41.   plugin.description=QObject::tr("Use vlc to open video files !!!");     
  42.    plugin.mimeTypes=mimeTypes;       
  43.    QList<QWebPluginFactory::Plugin> plugins ;      
  44.    plugins.append(plugin);      
  45.    return plugins;  
  46.  }  
  47.      QObject *FlashPlugin::create(  
  48.    const QString &mimeType,     
  49.    const QUrl &url,   
  50.    const QStringList &argumentNames,                  
  51.    const QStringList &argumentValues)   
  52.    const{      
  53.    QTextEdit * editnew QTextEdit();      
  54.    edit->setObjectName("我是插件");      
  55.    edit->setPlainText(mimeType + " :  " + url.toString() +"\n\n"           
  56.           +QString::fromUtf8("這里本來是需要adobeFlash插件的,")+"\n"          
  57.            +QString::fromUtf8("但現(xiàn)在替換成了我們自定義的插件(QTextEdit插件了)。")   
  58.        );      
  59.      Q_UNUSED(argumentNames);      
  60.      Q_UNUSED(argumentValues);      
  61.      qDebug()<<"create flash plugin";     
  62.   return edit;  
  63. }  

//Q_EXPORT_PLUGIN2()必不可少,//只有這樣FlashPlugin插件類才為外部可見,插件名為WebkitPluginFlashQ_EXPORT_PLUGIN2(WebkitPluginFlash,FlashPlugin)

Q_EXPORT_PLUGIN2 在Qt幫助文檔中的說明如下:

  1. Q_EXPORT_PLUGIN2 ( PluginName, ClassName )  
  2. This macro exports the plugin class ClassName for the plugin specified by PluginName. 
  3. The value of PluginName should correspond to the TARGET specified in the plugin's project file.   
  4.  
  5. There should be exactly one occurrence of this macro in the source code for a Qt plugin, 
  6. and it should be used where the implementation is written rather than in a header file. 

Q_EXPORT_PLUGIN2(WebkitPluginFlash, FlashPlugin) 中的WebkitPluginFlash為編譯之后生成的庫的名字,這里的生成的庫的完整名字為:libWebkitFlashPlugin.so, FlashPlugin 是插件類名。

現(xiàn)在只要把生成的libWebkitFlashPlugin.so插件庫拷貝到webkitpluginfactory插件工廠能搜到的目錄下就行了(本例中我在webkitpluginfactory.cpp中指定的位置為 const char *s = "/home/nxx/FlashPlugin-build-desktop";)。

上面的插件庫和前面的工廠類,QWebView對象組合在一起就可以實現(xiàn):

當(dāng)用QWebView打開包含了需要 mimeType.name="application/x-shockwave-flash" 類型的插件的網(wǎng)頁的時候,就會調(diào)用到我們自定義的flashplugin插件了。

效果如下:

詳解為QT Webkit編寫插件案例實現(xiàn)

小結(jié):詳解為QT Webkit編寫插件案例實現(xiàn)的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!

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

2011-06-27 16:59:19

Qt 動態(tài) 插件

2011-06-14 11:48:38

Webkit QT

2011-08-29 14:19:48

QtWebkit瀏覽器

2011-09-09 18:43:13

Qt Webkit瀏覽器

2011-09-09 17:24:39

Qt Webkit模塊

2011-06-27 17:24:37

Qt 插件

2011-09-01 15:22:16

Qt WebKitWebKit

2011-08-29 14:40:58

QTWebkit

2011-10-13 14:26:12

Qt WebKitWebKit

2011-08-29 10:59:47

QtWebkit嵌入式

2011-09-06 10:46:19

QT播放器

2011-09-07 16:43:38

Qt Widget

2011-08-29 10:22:48

QtWebkit 模塊HTML文檔

2011-09-01 16:01:25

Qt插件

2011-06-24 15:16:33

Qt 插件

2011-07-05 17:54:43

QT Sqlite ARM

2011-09-09 16:23:16

Android Web測試

2011-08-29 11:25:29

QTWebKit鼠標(biāo)

2011-08-29 10:01:27

QTWebkit插件

2011-09-09 15:31:04

Android Web插件
點贊
收藏

51CTO技術(shù)棧公眾號