国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

詳解為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-07 16:43:38

Qt Widget

2011-09-06 10:46:19

QT播放器

2011-08-29 10:59:47

QtWebkit嵌入式

2011-08-29 10:22:48

QtWebkit 模塊HTML文檔

2011-06-24 15:16:33

Qt 插件

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

2011-08-29 11:25:29

QTWebKit鼠標

2011-08-29 10:01:27

QTWebkit插件
點贊
收藏

51CTO技術棧公眾號

jizzjizz中国精品麻豆| 美女91在线| 精品国产福利视频| 天堂在线视频| 欧美私人免费视频| 欧美日韩精品免费观看视完整| 欧美精品福利在线| 日韩国产在线一| 性欧美.com| 台湾佬中文娱乐网欧美电影| 国产美女一区二区| 91精品久久久久久久久不口人| 性xxxx丰满孕妇xxxx另类| 国产综合久久久久久鬼色| 中日韩午夜理伦电影免费| 茄子视频成人免费观看| 国产激情在线播放| 日韩中文字幕视频在线| 婷婷色综合网| 男人天堂手机在线视频| 欧美性猛xxx| 国产精品久久久久久久久久齐齐| 国产日韩精品在线观看| 本田岬高潮一区二区三区| 国产69久久| 亚洲天堂av高清| 亚洲黄色影片| 日本二区视频| 日本高清不卡aⅴ免费网站| 色爱综合区网| 国产欧美日韩综合精品二区| 国产乱码一区二区三区| 理论片午午伦夜理片在线播放| 国产精品免费久久久久久| 久久色中文字幕| 国产成人精品亚洲日本在线观看| 成人做爰66片免费看网站| 亚洲免费在线视频| 精品自拍偷拍| 成人黄18免费网站| 欧美第一页在线| 久久先锋影音av鲁色资源网| 久久电影天堂| 成熟老妇女视频| 韩国福利视频一区| 一级中文字幕一区二区| 视频小说一区二区| 国产一二三四在线视频| 在线播放日韩专区| 91免费国产在线| 国产精品3区| 午夜肉伦伦影院| 最新中文字幕一区二区三区| 黄色一级在线视频| 国产人妖乱国产精品人妖| 男人久久天堂| 欧美一区二区三区综合| 在线视频一区二区| 国产日韩欧美a| 日韩www.| 国产91在线免费| 欧美激情视频给我| 亚洲国产成人av好男人在线观看| 久久在线电影| 九色91在线| jizz亚洲大全| 精品久久久三级| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲蜜桃精久久久久久久| 99精品国产福利在线观看免费| 蜜桃视频www网站在线观看| 国产喷水theporn| 成人在线小视频| 亚洲国产日韩欧美在线99| 亚洲人成亚洲人成在线观看图片| 亚洲a在线视频| 日韩中文影院| 国内在线精品| 亚洲欧美在线精品| 欧洲视频一区二区三区| 欧美一区二区大胆人体摄影专业网站| 91超碰这里只有精品国产| 国产精品网站一区| 久久99国产精品尤物| 91九色精品| 色婷婷狠狠五月综合天色拍 | 视频一区在线视频| 亚洲性色av| 奇米影视四色在线| 成人在线观看网址| 日韩在线视频免费观看| 亚洲免费观看高清| 性xx色xx综合久久久xx| silk一区二区三区精品视频| 91小视频xxxx网站在线| 日本1区2区3区中文字幕| 97久久国产亚洲精品超碰热| 国产综合欧美在线看| 日本亚洲欧美成人| 欧美成人亚洲成人| 中文字幕欧美日韩在线| 精品国产一区二区三区四区四| 亚洲国产精品自拍| 不卡免费追剧大全电视剧网站| 欧美在线亚洲| 免费成人av| 怕怕欧美视频免费大全| av不卡一区| 视频欧美一区| 欧美v亚洲v综合v国产v仙踪林| 亚洲综合伊人久久大杳蕉| dj大片免费在线观看| 99免费视频| 日本特级黄色大片| 日韩av电影免费在线观看| 欧美日韩亚洲一区二区三区四区| 国产精品久久久久久久天堂| 亚州精品天堂中文字幕| 最新69国产成人精品视频免费| 亚洲欧洲在线视频| 欧美激情免费视频| 国产精品成av人在线视午夜片| 欧美激情在线狂野欧美精品| 日本sm极度另类视频| 91成人免费视频| 精品国产第一页| 美女一区视频| 在线观看欧美一区| 天堂av免费看| 亚洲精品xxxx| 亚洲无限av看| 68精品久久久久久欧美 | xxxxxx欧美| 精品人人视频| 四虎国产精品免费久久| 黑人巨大精品| 99久久人爽人人添人人澡| 奇米777国产一区国产二区| 免费在线观看成人av| 26uuu亚洲婷婷狠狠天堂| 精品国产污污免费网站入口| 国产91亚洲精品| 正在播放国产精品| 久久99国产精品一区| 国产精品亚洲αv天堂无码| 五月伊人六月| 国产va在线视频| 久久人人爽人人爽人人片av不| 中文国产一区| 中文字幕乱码日本亚洲一区二区| 色成人在线视频| 一区二区三区久久精品| 久久人人爽人人爽爽久久| 国产精品香蕉av| 黄色一级视频播放| 免费在线观看视频| 中文字幕有码在线视频| 中文无码日韩欧| 日韩电影在线看| 一区二区免费在线播放| 亚洲人在线视频| 日韩欧美激情一区二区| v888av成人| 3d性欧美动漫精品xxxx软件| 97精品国产福利一区二区三区| 精品一区二区三区免费观看 | 免费看成一片| 3p视频在线观看| 精品视频在线一区二区在线| 久久精品影视| 18涩涩午夜精品.www| 亚洲免费电影一区| 国产精品国语对白| 精品人妻大屁股白浆无码| 高清国产福利在线观看| 久久资源综合| 日韩毛片精品高清免费| 青青草精品毛片| 欧美黑人孕妇孕交| 亚洲欧美偷拍自拍| 调教+趴+乳夹+国产+精品| 国产精品视频1区| 精品视频在线观看一区| 精品一区二区三区免费看| 国产九一精品| 今天的高清视频免费播放成人| 美女诱惑一区二区| 国产经典欧美精品| www.av亚洲| 国产精品久久久久久久岛一牛影视| 国产成人亚洲综合a∨婷婷| 欧美三级视频在线播放| 国内精品久久久久久久久| 欧美亚洲日本一区二区三区| av老司机免费在线| 亚洲自拍另类| 欧美精品一级二级| 免费观看中文字幕| 粉嫩一区二区三区四区公司1| 成人福利视频网站|