偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

或者

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

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

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

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

下面我們就來(lái)實(shí)現(xiàn)這個(gè)插件工廠類WebkitPluginFactory, 主要需要實(shí)現(xiàn)的就是 QWebPluginFactory  中的兩個(gè)虛函數(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ù)來(lái)決定創(chuàng)建相應(yīng)的插件。下面給出這個(gè)類的實(shí)現(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. //插件接口,這個(gè)接口是我們自定義的插件的同意接口。    //這個(gè)接口在后面會(huì)講到。    
  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下是插件庫(kù)的后綴為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.         //下面是載入自定義的接口,只有這樣才能支持動(dòng)態(tài)插件創(chuàng)建,如果固定死了,將不利于擴(kuò)展          
  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) //更具M(jìn)IME類型,創(chuàng)建相應(yīng)的插件實(shí)例                   
  89.        return interfaces[i]->    
  90.     create( mimeType, url, argumentNames, argumentValues);            
  91.  }        
  92. }     
  93.  }      
  94.  return NULL; //如果沒(méi)有,直接返回NULL,webkit會(huì)進(jìn)行處理的  

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

自定義的插件接口:

  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為一個(gè)接口  
  15.    Q_DECLARE_INTERFACE(WebKitPluginInterface, "com.plugin.uvchip.www/1.0")  
  16.    #endif // WEBKITPLUGININTERFACE_H  

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

  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. 

下面我們開(kāi)始實(shí)現(xiàn)這個(gè)接口:

我們將flashplugin編譯成庫(kù),這樣就可以供插件工廠WebkitPluginFactory加載訪問(wèn)了。

  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是一個(gè)接口      
  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("這里本來(lái)是需要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插件類才為外部可見(jiàn),插件名為WebkitPluginFlashQ_EXPORT_PLUGIN2(WebkitPluginFlash,FlashPlugin)

Q_EXPORT_PLUGIN2 在Qt幫助文檔中的說(shuō)明如下:

  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為編譯之后生成的庫(kù)的名字,這里的生成的庫(kù)的完整名字為:libWebkitFlashPlugin.so, FlashPlugin 是插件類名。

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

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

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

效果如下:

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

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

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

2011-06-27 16:59:19

Qt 動(dòng)態(tài) 插件

2011-06-14 11:48:38

Webkit QT

2011-08-29 14:19:48

QtWebkit瀏覽器

2011-09-09 17:24:39

Qt Webkit模塊

2011-09-09 18:43:13

Qt Webkit瀏覽器

2011-09-01 15:22:16

Qt WebKitWebKit

2011-06-27 17:24:37

Qt 插件

2011-08-29 14:40:58

QTWebkit

2011-10-13 14:26:12

Qt WebKitWebKit

2011-09-06 10:46:19

QT播放器

2011-09-07 16:43:38

Qt Widget

2011-08-29 10:59:47

QtWebkit嵌入式

2011-08-29 10:22:48

QtWebkit 模塊HTML文檔

2011-06-24 15:16:33

Qt 庫(kù) 插件

2011-09-01 16:01:25

Qt插件

2011-09-09 15:31:04

Android Web插件

2011-07-05 17:54:43

QT Sqlite ARM

2011-09-09 16:23:16

Android Web測(cè)試

2011-08-29 11:25:29

QTWebKit鼠標(biāo)

2011-08-29 10:01:27

QTWebkit插件
點(diǎn)贊
收藏

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