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

詳解為QT Webkit編寫插件案例實現

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

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

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

或者

//這里假設webView是QWebView的對象:

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

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

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

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

  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() 方法則根據mimeType等參數來決定創建相應的插件。下面給出這個類的實現代碼:  
  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.         //下面是載入自定義的接口,只有這樣才能支持動態插件創建,如果固定死了,將不利于擴展          
  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類型,創建相應的插件實例                   
  89.        return interfaces[i]->    
  90.     create( mimeType, url, argumentNames, argumentValues);            
  91.  }        
  92. }     
  93.  }      
  94.  return NULL; //如果沒有,直接返回NULL,webkit會進行處理的  

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

自定義的插件接口:

  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. 

下面我們開始實現這個接口:

我們將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("但現在替換成了我們自定義的插件(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 是插件類名。

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

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

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

效果如下:

詳解為QT Webkit編寫插件案例實現

小結:詳解為QT Webkit編寫插件案例實現的內容介紹完了,希望通過本文的學習能對你有所幫助!

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

2011-06-27 16:59:19

Qt 動態 插件

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-09-01 16:01:25

Qt插件

2011-06-24 15:16:33

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測試

2011-08-29 11:25:29

QTWebKit鼠標

2011-08-29 10:01:27

QTWebkit插件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩久久精品电影 | 国产精品呻吟久久av凹凸 | 日韩毛片| 国产高清视频一区 | 久久久夜| 在线一区视频 | 草草草影院 | 国产又色又爽又黄又免费 | 天天操天天干天天爽 | 久久免费小视频 | 精品1区2区 | 成人av鲁丝片一区二区小说 | 夜夜操天天艹 | 成人国产精品久久 | 免费毛片在线 | 在线视频91| 国产精品观看 | 精品久久久久久中文字幕 | 亚洲一区二区日韩 | 国产精品免费在线 | 午夜在线小视频 | 人人99 | 伊人超碰| 亚洲人成人一区二区在线观看 | 欧美成人在线网站 | 久久久www成人免费无遮挡大片 | 中文字幕在线视频一区二区三区 | 99热都是精品 | www.成人在线视频 | 中文字幕免费视频 | 亚洲成av人片在线观看无码 | 国产中文字幕在线观看 | 天天弄天天操 | www.伊人.com | 欧美日日日日bbbbb视频 | www.国产 | 人人玩人人添人人澡欧美 | 91视频在线观看免费 | 亚州精品天堂中文字幕 | 四虎影院新网址 | 亚洲视频三区 |