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
- QT实现浏览器插件 调用及回调 (一)
- QT实现浏览器插件 调用及回调 (二)
- QT实现浏览器插件 调用及回调 (三)
- Qt一步一步实现插件调用(附源码)、Qt一步一步实现插件通信(附源码)
- Qt Webkit中浏览器插件设计实现
- Qt Webkit中浏览器插件设计实现
- Qt Webkit中浏览器插件设计实现
- Qt一步一步实现插件调用(附源码)
- Qt之一步一步实现插件调用
- QT 图片浏览器(一)
- chrome 浏览器调用 ocx 插件(二)
- QT 插件调用
- Qt调用插件
- Intellij插件开发:MonkeyMaster插件的实现(一)——命令行封装与调用
- QT浏览器插件开发入门
- Android浏览器插件开发(一)
- 使用FireBreath写浏览器插件(一)
- 使用FireBreath写浏览器插件(一)
- 网页上使用的输入法——Google Transliteration
- FICO常用的IDOC程序、表和IDOC出口
- 解决jboos7与项目log4j的冲突
- TabPageIndicator 动态刷新数据
- C++之标准设备IO操作流
- QT实现浏览器插件 调用及回调 (一)
- SimpleDateFormat的格式原来可以是任意的,不需要是正确的日期格式
- 把二元查找树转变成排序的双向链表
- vc编译warning LNK4089的解决方法
- C++之预定义类型IO格式控制
- 判断链表是否带环
- provisioning profiels 中不能添加真机的情况
- Gradle(二) 项目结构
- Spring Aop原理及拦截器