QT Webkit的插件Plugin设计实现

2023-11-18

 Qt Webkit中浏览器插件Plugin设计实现是我们要介绍的内容,我们都知道浏览器中有一套由Netscape浏览器传承下来的插件接口,

包括webkit,firefox都是支持的,但是那个开发起来比较困难,并且是平台相关的,借助于Qt的跨平台的特性,可以方便地为Qt开

发出一套跨平台的插件。

 

    QtWebkit中插件可以有两种,一种Mime必须是application/x-qt-plugin或者application/x-qt-styled-widget,而另外一种则无需固定,

可以是除了前面的两种以外任意其它Mime类型。

 

前一种相对来说开发起来比较容易,只需重新实现

[html]  view plain  copy
  1. QObject * QWebPage::createPlugin (const QString& classid,   
  2.     const QUrl& url,   
  3.     const QStringList& paramNames,   
  4.     const QStringList &paramValues)   

这个函数即可,这个函数会把HTML文件中的参数都传递进来

下面是一个例子:

[html]  view plain  copy
  1. class PluginPage : public QWebPage    
  2. {   
  3. public:  
  4.     PluginPage(QObject *parent = 0)  : QWebPage(parent) {}    
  5. protected:    
  6.     virtual QObject *createPlugin(const QString &classid, const QUrl &url,  const QStringList &paramNames,    
  7.     const QStringList &paramValues)    
  8.     {    
  9.         QObject *result = 0;    
  10.         if (classid == "pushbutton")    
  11.             result = new QPushButton();    
  12.         else if (classid == "lineedit")    
  13.             result = new QLineEdit();    
  14.   
  15.         if (result)    
  16.             result->setObjectName(classid);    
  17.         //可以进行一些处理    
  18.          return result;    
  19.     }    
  20. }  

 

这样下面的网页就可以一个pushbutton了:

 

[html]  view plain  copy
  1. <html>   
  2. <body> <object type='application/x-qt-plugin' classid='pushbutton' id='mybutton'/> </body>   
  3. </html>   


 

并且还可以在JavaScript访问到QPushbutton,例如:

document.getElementById('mybutton').text将会返回按钮上的字符串。

 

上面介绍的插件设计方式中虽然方便,但是其Mime类型只能是application/x-qt-plugin或者application/x-qt-styled-widget,

这个有时候可能满足不了实际应用需求,那么另一种就没有这种限制,那可以是任意Mime类型的。这种设计需要重新实现

QWebPluginFactory这个纯虚基类。先看看他的声明:

 

[html]  view plain  copy
  1. class QWEBKIT_EXPORT QWebPluginFactory : public QObject   
  2. {    
  3.     ……    
  4. public:    
  5.     struct Plugin {    
  6.         QString name;   
  7.         QString description;    
  8.         QList<MimeType> mimeTypes;    
  9.     };    
  10.     explicit QWebPluginFactory(QObject* parent = 0);    
  11.     virtual ~QWebPluginFactory();  
  12.     virtual QList<Plugin> plugins() const = 0;   
  13.     virtual void refreshPlugins();   
  14.     virtual QObject *create(const QString& mimeType, const QUrl&,   
  15.          const QStringList& argumentNames, const QStringList& argumentValues) const = 0;   
  16.     virtual bool extension(Extension extension, const ExtensionOption* option = 0, ExtensionReturn* output = 0);   
  17.     virtual bool supportsExtension(Extension extension) const;   
  18.     ……   
  19. };  

 

重点要实现的接口是plugins,用于获取plugin的列表,用于webkit内部判断该mime类型是否被支持,如果可以支持,

那么就会调用create来创建这个插件,而具体打开哪个文件以及参数都会传递进来。

 

后两个extension和supportsExtension接口暂时没有发现有什么用处,暂不考虑。

因此重新实现的WebPluginFactory如下:

[html]  view plain  copy
  1. class WebPluginFactory: public QWebPluginFactory    
  2. {        
  3. public:            
  4.     WebPluginFactory(QObject *parent = 0);    
  5.     ~WebPluginFactory(){};            
  6.     QList<QWebPluginFactory::Plugin> plugins() const;  
  7.     void refreshPlugins();  
  8.     QObject *create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames,   
  9.          const QStringList &argumentValues) const ;  
  10.     bool extension(QWebPluginFactory::Extension extension, const QWebPluginFactory::ExtensionOption *option = 0,  
  11.          QWebPluginFactory::ExtensionReturn *output = 0);  
  12.     bool supportsExtension(QWebPluginFactory::Extension extension) const;        
  13. private:            
  14.     // 用于将载入的插件记录下来            
  15.     mutable QList<QList<QWebPluginFactory::Plugin> > pluginslist;  
  16.     mutable QList<WebKitPluginInteface *> interfaces;    
  17. };   

 

具体实现主要是create和plugins两个函数:

[html]  view plain  copy
  1. QList<QWebPluginFactory::Plugin> WebPluginFactory::plugins() const  {        
  2.     const char * s=getenv("BROWSER_PLUGIN_DIR");        
  3.     static bool isFirst=true;        
  4.     if(!isFirst)      {  
  5.           return pluginslist;  
  6.     }        
  7.     isFirst=false;        
  8.     QString spath;        
  9.     if(s)        
  10.         spath=s;  
  11.     else  {    
  12.         spath=".";    
  13.     }        
  14.     QDir dir(spath);        
  15.     QStringList filters;        
  16.     QString abspath=dir.absolutePath();    
  17.     filters<<"libqtweb*.so";   
  18.     //查找下面的动态库,linux下是so,windows下则应该是dll,        
  19.      QStringList files=dir.entryList(filters);        
  20.     foreach(QString file,files)      {  
  21.         file=dir.filePath(file);            
  22.         QPluginLoader loader(file,0);  
  23.         QObject * objloader.instance();    
  24.         //下面是载入自定义的接口,只有这样才能支持动态插件创建,如果固定死了,将不利于扩展,后一节会介绍这部分内容   
  25.          WebKitPluginInteface * interfaceqobject_cast<WebKitPluginInteface*> (obj);  
  26.         if (interface == 0)  {  
  27.             //ignore error when loading so ;   
  28.             continue;            
  29.         }            
  30.         interface->plugins();            
  31.         plugins.append(interface->plugins());   
  32.         pluginslist.append(interface->plugins());    
  33.         interfaces.append(interface);        
  34.     }        
  35.     return plugins;    
  36. }    
  37.   
  38. void WebPluginFactory::refreshPlugins()  {        
  39.     Reload();    
  40. }    
  41.   
  42. QObject * WebPluginFactory::create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames,            
  43.     const QStringList &argumentValues) const    
  44. {        
  45.     for(int i=0;i<pluginslist.size();i++){  
  46.         for( int j=0;j< pluginslist[i].size();j++){  
  47.               foreach(WebPluginFactory::MimeType mt, pluginslist[i][j].mimeTypes){  
  48.                   if(mt.name == mimeType) //查找到,创建实例  
  49.                          return interfaces[i]->create( mimeType, url, argumentNames, argumentValues);  
  50.               }            
  51.         }        
  52.     }        
  53.     return NULL; //如果没有,直接返回NULL,webkit会进行处理的    
  54. }   


 

这两个最主要的接口都是围绕着mimetype进行的,通过返回的列表告诉webkit插件支持什么类型的文件,而create则根据mimetype来识别文件类型,


然后创建相应的插件。

下面会简单的创建一个插件来演示如何创建一个插件。

上面讲到可以通过扩展QWebPage接口进行动态载入插件,但是插件的接口并没有明确,这里通过介绍自定义的接口来实现插件的动态载入。

首先是接口的定义:

[html]  view plain  copy
  1. class WebKitPluginInteface  {        
  2. public:            
  3.     virtual ~WebKitPluginInteface(){};  
  4.     virtual QList<QWebPluginFactory::Plugin> plugins()const =0;  
  5.     virtual QObject *create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames,                    
  6.         const QStringList &argumentValues) const =0;    
  7. };     
  8. Q_DECLARE_INTERFACE(WebKitPluginInteface, "baizx.cnblogs.com/1.0")   


 

这样自定义的插件就可以通过实现这个接口来实现定制的插件。下面是一个例子:

[html]  view plain  copy
  1. class TestPlugin :public QObject,public WebKitPluginInteface {   
  2.     Q_OBJECT   
  3.     Q_INTERFACES(WebKitPluginInteface)   
  4. public:   
  5.     TestPlugin(QObject * parent=0): WebkitPlugin(parent){};   
  6.     virtual ~TestPlugin(){};   
  7.     virtual QList<QWebPluginFactory::Plugin> plugins()const ;   
  8.     virtual QObject *create(const QString &mimeType, const QUrl &url,   
  9.         const QStringList &argumentNames, const QStringList &argumentValues) const ;   
  10. };   
  11.   
  12. QList<QWebPluginFactory::Plugin> TestPlugin::plugins()const   
  13. {   
  14.     QList<QWebPluginFactory::Plugin> plugins ;   
  15.     QWebPluginFactory::Plugin plugin;   
  16.     QWebPluginFactory::MimeType mimeType;   
  17.     QStringList strings;   
  18.     plugin.name="testplugin";   
  19.     plugin.description="testplugin !!!";   
  20.     mimeType.name="application/x-textedit";   
  21.     mimeType.description="test textedit";   
  22.     strings.append(".etxt");   
  23.     mimeType.fileExtensions=strings;   
  24.     QList<QWebPluginFactory::MimeType> mimeTypes;   
  25.     mimeTypes.append(mimeType);   
  26.     plugin.mimeTypes=mimeTypes;   
  27.     plugins.append(plugin);   
  28.     return plugins;   
  29. }   
  30.   
  31. QObject *TestPlugin::create(const QString &mimeType, const QUrl &url,   
  32.         const QStringList &argumentNames, const QStringList &argumentValues) const   
  33. {   
  34.     QTextEdit * editnew QTextEdit();   
  35.     edit->setObjectName("我是插件");   
  36.     edit->setPlainText(mimeType + url.toString() );   
  37.     Q_UNUSED(argumentNames);   
  38.     Q_UNUSED(argumentValues);   
  39.     return edit;   
  40. }  


 

这样一个简单的插件就创建完毕了,具体实际应用中可能会用到很到参数,并且会载入实际的内容,这里只是一个演示。

小结:Qt Webkit浏览器插件设计实现的内容介绍完了,希望通过本文的学习能对你有所帮助!

 


FROM:  http://blog.csdn.net/myaccella/article/details/7009086



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT Webkit的插件Plugin设计实现 的相关文章

  • SpringSecurity+JWT认证流程解析

    楔子 本文适合 对Spring Security有一点了解或者跑过简单demo但是对整体运行流程不明白的同学 对SpringSecurity有兴趣的也可以当作你们的入门教程 示例代码中也有很多注释 大家在做系统的时候 一般做的第一个模块就是
  • 【内外网映射】通过外网ip来访问虚拟机服务器【原创】

    经试验 可以通过外网访问家里笔记本win 7里面的虚拟机vmvare的Ubuntn服务器 比如用手机来访问笔记本电脑的虚拟机的服务器等 注意 win 7的ip地址和虚拟机的ip地址的网段是不一样的 特别注意 只适用于公网ip是固定的 不固定
  • 一看就懂的ReactJs入门教程-精华版

    现在最热门的前端框架有AngularJS React Bootstrap等 自从接触了ReactJS ReactJs的虚拟DOM Virtual DOM 和组件化的开发深深的吸引了我 下面来跟我一起领略ReactJs的风采吧 文章有点长 耐
  • Dbeaver 修改SQL编辑器字体

    Dbeaver 版本 23 1 0 字体链接 YaHei Consolas Hybrid 1 12 YaHei Consolas Hybrid 1 12 如何换字体 窗口 gt 首选项 gt 用户界面 gt Appearance gt Co
  • 30数据类型检测

  • Mysql数据库Sql优化

    1 选择合适的字段属性 mysql中表越小 查询速度越快 所以 我们在创建表时 字段尽可能的设置最小 如果可以的话 可以用MEDIUMINT而不是BIGIN来定义整型字段 应该尽量把字段设置为NOTNULL 这样在将来执行查询的时候 数据库
  • 华为OD机试真题- 书籍叠放-2023年OD统一考试(B卷)

    题目描述 书籍的长 宽都是整数对应 l w 如果书A的长宽度都比B长宽大时 则允许将B排列放在A上面 现在有一组规格的书籍 书籍叠放时要求书籍不能做旋转 请计算最多能有多少个规格书籍能叠放在一起 输入描述 输入 books 20 16 15
  • mybatis之foreach用法

    在做mybatis的mapper xml文件的时候 我们时常用到这样的情况 动态生成sql语句的查询条件 这个时候我们就可以用mybatis的foreach了 foreach元素的属性主要有item index collection ope
  • 选择器函数querySelector和querySelectorAll

    选择器是Css非常强大的功能 早先一般是通过getElementById和getElementsByTagName来获取页面元素 在一些场景下就很不方便 后来DOM扩展出了Selector API标准 其中 Selector API Lev
  • 移植uboot-支持yaffs烧写,打补丁

    1 修改uboot支持yaffs 首先 每个命令都会对应一个文件 比如nand命令对应的common cmd nand c 而我们使用nand命令时 便会进入do nand 函数 位于common cmd nand c 1 1do nand

随机推荐

  • 产品经理的思考-ChatGPT的影响

    最近ChatGPT的不断升温 公司开始全面布局和应用人工智能 本以为今年的赋智会有个过渡过程 没想到来的这么凶猛 随着应用的深入 越来越多的开始了灵魂质问 随着大模型的不断深入应用 什么职位会被取代 我们应该如何与ChatGPT共存 Cha
  • 2017年10米分辨率全球土地覆盖产品(FROM-GLC10)Python下载爬虫

    此为2017清华大学地球系统科学系宫鹏教授团队研发的重大成果世界首套 2017年10米分辨率全球土地覆盖产品 FROM GLC10 爬虫下载爬虫分享 一 参考网站 1 全国各省10米分辨率的土地利用数据的制作与分享 2 世界首套2017年1
  • vs2019编译c语言提示有病毒,关于VS2019代码编译的问题(C++)

    代码很长 这里就不打出来了 1 严重性代码说明项目文件行禁止显示状态 错误C2664 BOOL SetFileAttributesW LPCWSTR DWORD 无法将参数 1 从 const char 36 转换为 LPCWSTR Pro
  • android opengl es 总结

    什么是OpenGL ES OpenGL ES 为OpenGL for Embedded System的缩写 为适用于嵌入式系统的一个免费二维和三维图形库 为桌面版本OpenGL 的一个子集 OpenGL ES 定义了一个在移动平台上能够支持
  • Python:每日一题之最少砝码

    问题描述 你有一架天平 现在你要设计一套砝码 使得利用这些砝码可以称出任意 小于等于 N 的正整数重量 那么这套砝码最少需要包含多少个砝码 注意砝码可以放在天平两边 输入格式 输入包含一个正整数 N 输出格式 输出一个整数代表答案 样例输入
  • (CMake) 指定生成器 generator

    文章目录 问题引入 具体处理 当前环境 例子 解决方案 命令行 设置变量 设置win环境变量 END 附录 win cmake 3 24 2 help linux cmake 3 10 2 help cmake基础 CMake 从下载到构建
  • Keil运行stm32项目无法打断点调试

    项目场景 有个新同事接了外协写的STM32F429的项目 项目接过来编译和烧录都没问题 但是Debug调试时候没法打断点 没有灰色区域可以点断点 点击运行可以 但点暂停也没有停止黄色光标 debug模式下就如同这样 1 问题描述 根据上述现
  • 关于APT32C001ADC采集不准的问题说明

    因为之前开发一款产品 要使用到触摸按键 又不想新增一个触摸IC 所以选择了APTC001进行开发 但是在调试的时候发现ADC有时候会不准 有时候是0电压的 但读寄存器的值却不是零 有时候读电源电压 那应该是4096的 但实际采集回来的去不是
  • 【毕业设计】机器视觉手势检测和识别系统 - python 深度学习

    文章目录 0 前言 1 实现效果 2 技术原理 2 1 手部检测 2 1 1 基于肤色空间的手势检测方法 2 1 2 基于运动的手势检测方法 2 1 3 基于边缘的手势检测方法 2 1 4 基于模板的手势检测方法 2 1 5 基于机器学习的
  • 浅述SATA接口Raid、AHCI、IDE三种模式

    今天在一台计算机上插上CF卡 不能工作 CF卡灯不亮 进BIOS SATA mode从IDE改成AHCI就好了 首先说一下 关于主板的SATA接口的工作模式 BIOS中常见的选项有以下三种 RAID 部分技嘉主板叫XHD AHCI IDE
  • Java String 常用操作方法说明和使用

    ps Java中的String类是一个非常重要的类 在Java程序中广泛使用 它可以用来保存和操作字符串 在这篇博客中 我们将对Java String的所有操作方法进行说明和使用 1 1 使用双引号创建字符串 String str1 Hel
  • ObjectC基础之注释、关键字、数据类型

    一 OC的注释 OC的注释不是 或者 了 它的注释是 举个例子 这是被注释掉的内容 二 OC的关键字 上图我们比较陌生的有 register typedef extern union unsigned const signed goto v
  • 自定义函数实现字符串处理函数strcat、 strcpy、strcmp、strlen和strlwr

    编C语言程序 用自定义函数实现字符串处理函数strcat strcpy strcmp strlen和strlwr的功能 strlen char str int n 0 char p str while p n return n strcat
  • 蓝桥杯 题库 简单 每日十题 day2

    01 卡片 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小蓝有很多数字卡片 每张卡片上都是数字 0 到 9 小蓝准备用这些卡片来拼一些数 他想从 1 开始拼出正整数 每拼一个 就保存起来 卡片就不能用来
  • 源 “MySQL 8.0 Community Server“ 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

    源 MySQL 8 0 Community Server 的 GPG 密钥已安装 但是不适用于此软件包 请检查源的公钥 URL 是否配置正确 只需将 sudo yum install y mysql server 改为 sudo yum i
  • Linux如何查看进程、杀死进程、启动进程等常用命令

    1 查进程 ps命令查找与进程相关的PID号 ps a 显示现行终端机下的所有程序 包括其他用户的程序 ps A 显示所有程序 ps c 列出程序时 显示每个程序真正的指令名称 而不包含路径 参数或常驻服务的标示 ps e 此参数的效果和指
  • Java虚拟机二:JVM性能调优

    堆空间的划分 Java中的堆是JVM所管理的最大的一块内存空间 主要用于存放各种类的实列对象 这样划分的目的是为了使JVM能够更好的管理堆内存中的对象 堆的内存划分如图 Java堆的内存划分如图所示 分别为年轻代 Old Memory 老年
  • 【burpsuite安全练兵场-服务端4】操作系统命令注入-5个实验(全)

    前言 介绍 博主 网络安全领域狂热爱好者 承诺在CSDN永久无偿分享文章 殊荣 CSDN网络安全领域优质创作者 2022年双十一业务安全保卫战 某厂第一名 某厂特邀数字业务安全研究员 edusrc高白帽 vulfocus 攻防世界等平台排名
  • 等保三级安全要求简要攻略-安全通信网络和安全区域边界

    之前有两篇文章写了为什么要做等保测评 等保测评的含义以及等保测评这份工作的一些职责和一些常见的FAQ 没有看过的朋友可以先去看下我的另外两篇文章 一起聊聊等保测评 和 一起聊聊等保测评工作内容以及FAQ 今天我们来攻略一下等保2 0国家标准
  • QT Webkit的插件Plugin设计实现

    Qt Webkit中浏览器插件Plugin设计实现是我们要介绍的内容 我们都知道浏览器中有一套由Netscape浏览器传承下来的插件接口 包括webkit firefox都是支持的 但是那个开发起来比较困难 并且是平台相关的 借助于Qt的跨