QT实现浏览器插件 调用及回调 (一)

来源:互联网 发布:河南公务员网络 编辑:程序博客网 时间:2024/06/05 06:59


QT浏览器插件的实现方式,浏览器插件不需要和浏览器编译到一起,单独的so文件,放到制定目录后,浏览器启动后自动加载。


1,QT浏览器实现支持插件。


//为浏览器加入插件支持webView->page()->setPluginFactory(new WebkitPluginFactory(webView));


//生产Plugin的工厂 webkitpluginfactory.h#include <QWebPluginFactory>#include <QUrl>#include "webkitplugininterface.h"class WebkitPluginFactory : public QWebPluginFactory{Q_OBJECTpublic://WebkitPluginFactory(QObject *parent = 0);WebkitPluginFactory(QWebView *webView);QObject *create ( const QString & mimeType, const QUrl & url, const QStringList & argumentNames, const QStringList & argumentValues ) const;QList<QWebPluginFactory::Plugin> plugins () const;private:// 插件列表mutable QList<QList<QWebPluginFactory::Plugin> > pluginslist;//插件接口,这个接口是我们自定义的插件的同意接口。mutable QList<WebKitPluginInterface *> interfaces;mutable QWebView * mWebView;};


//工厂的具体实现#include "webkitpluginfactory.h"#include <QPluginLoader>#include <QDebug>#include <QDir>WebkitPluginFactory::WebkitPluginFactory(QWebView *webView) : QWebPluginFactory(){    if(webView != NULL)    {        mWebView = webView;        qDebug() << "This means webview is not null!";    }     qDebug()<<"debug : WebkitPluginFactory";}QList<QWebPluginFactory::Plugin> WebkitPluginFactory::plugins () const{//定义插件的.so文件的存放目录。    const char *s = "/opt/qtcreator-2.8.0/bin/build-WebkitPluginFlash-Qt_4_8_5_qt_4_8_5-Debug";    static bool isFirst=true;    static QList<QWebPluginFactory::Plugin> plugins;    if(!isFirst)     {        return plugins;     }    isFirst=false;    plugins.clear();    QString spath;    if(s)        spath=s;    elsespath=".";QDir dir(spath);    QStringList filters;    QString abspath=dir.absolutePath();qDebug()<<abspath;    //获取指定目录下的所有插件,linux下是插件库的后缀为so,windows下则是dll,    filters<<"lib*.so";    QStringList files=dir.entryList(filters);    qDebug()<<"files: "<<files;    qDebug() << "files: " << files.size();    foreach(QString file,files)    {qDebug()<<QLibrary::isLibrary(file);        file=dir.filePath(file);        qDebug()<<"path: "<<file;        QPluginLoader loader(file);        QObject * obj= loader.instance();        if(obj==0)            qDebug()<<"error: "<<loader.errorString();        //下面是载入自定义的接口,只有这样才能支持动态插件创建,如果固定死了,将不利于扩展         WebKitPluginInterface * interface= qobject_cast<WebKitPluginInterface*> (obj);        if(interface==0)        {            qDebug()<<"ignore error when loading so" ;            continue;        }        qDebug()<<"load plugins: "<<interface->plugins().at(0).name;        qDebug() << "load plugins description:" << interface->plugins().at(0).description;plugins.append(interface->plugins());        pluginslist.append(interface->plugins());        interfaces.append(interface);    }    if(plugins.isEmpty())    {        qDebug()<<"no plugins is loaded!";     }    return plugins;}QObject * WebkitPluginFactory::create ( const QString & mimeType, const QUrl & url, const QStringList & argumentNames, const QStringList & argumentValues ) const{    for(int i=0;i<pluginslist.size();i++)    {        for( int j=0;j< pluginslist[i].size();j++)        {            foreach(QWebPluginFactory::MimeType mt, pluginslist[i][j].mimeTypes)             {                if(mt.name == mimeType) //更具MIME类型,创建相应的插件实例                {                    interfaces[i]->setWebView(mWebView);                    return interfaces[i]-> create( mimeType, url, argumentNames, argumentValues);                }            }        }    }    return NULL; //如果没有,直接返回NULL,webkit会进行处理的}//插件和工厂都需要引入的接口webkitplugininterface.h#include <QWebPluginFactory>#include <QWebView>class WebKitPluginInterface{public:    virtual ~WebKitPluginInterface(){}    virtual QList<QWebPluginFactory::Plugin> plugins()const =0;    virtual QObject *create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) const =0;    virtual void setWebView(QWebView *webView) const=0;};//声明WebKitPluginInterface为一个接口Q_DECLARE_INTERFACE(WebKitPluginInterface, "com.plugin.uvchip.www/1.0")

参考文档:
http://blog.csdn.net/solin1985/article/details/6714898
原创粉丝点击