为QT的Webkit 编写插件

QT webkit 中加载flash文件 最近写一个windows下面的影音播放器,后来突发奇想想在窗体上面追加一个QWebView来显示http协议请求的页面来做百度音乐视频的播放,其实也就是页面的操作, 下面是部分核心代码: //将webview设置成使用flash插件,否则无法加载flash,NPSWF32 阅读详情

  为了允许的QWebView加载插件,必须使能QWebView的Javascript和Plugins属性,使能方法为:
QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptEnabled,true);
QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled,true);

或者

//这里假设webView是QWebView的对象:QWebView *webView;
webView->settings()->setAttribute(QWebSettings::JavascriptEnabled,true);
webView->settings()->setAttribute(QWebSettings::PluginsEnabled,true);

然后为QWebView添加插件工厂,这个插件工厂中包含了QWebView中所有可用的插件库,当然这个插件工厂中包含哪些插件得由我们程序员来定。添加插件工厂的方法为:
//为QWebView添加插件工厂,即告诉QWebView有哪些插件可用。
//这里的 WebkitPluginFactory 是Qt的虚类 QWebPluginFactory 的实现类,后面会讲到这个类。
webView->page()->setPluginFactory(new WebkitPluginFactory(this));

下面我们就来实现这个插件工厂类WebkitPluginFactory, 主要需要实现的就是 QWebPluginFactory  中的两个虚函数:

virtual QObject *create(const QString &mimeType, const QUrl &url, 
      const QStringList &argumentNames,const QStringList & argumentValues )const = 0;
virtual QList<Plugin>    plugins () const = 0;
plugins() 方法为获取所有可用的插件列表, create() 方法则根据mimeType等参数来决定创建相应的插件。下面给出这个类的实现代码:

webkitpluginfactory.h :

#ifndef WEBKITPLUGINFACTORY_H
#define WEBKITPLUGINFACTORY_H
 
#include <QWebPluginFactory>
#include <QUrl>
#include "webkitplugininterface.h"
 
class WebkitPluginFactory : public QWebPluginFactory
{
    Q_OBJECT
public:
    WebkitPluginFactory(QObject *parent = 0);
    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;
};
 
 
#endif // WEBKITPLUGINFACTORY_H

webkitpluginfactory.cpp :

#include "webkitpluginfactory.h"
#include <QPluginLoader>
 
#include <QDebug>
#include <QDir>
 
 
WebkitPluginFactory::WebkitPluginFactory(QObject *parent) :
        QWebPluginFactory()
{
    qDebug()<<"debug : WebkitPluginFactory";
}
 
QList<QWebPluginFactory::Plugin> WebkitPluginFactory::plugins () const
{
 
    //const char * s=getenv("BROWSER_PLUGIN_DIR");
    const char *s = "/home/nxx/FlashPlugin-build-desktop";
    static bool isFirst=true;
    static QList<QWebPluginFactory::Plugin> plugins;
    if(!isFirst)
    {
        return plugins;
    }
    isFirst=false;
    plugins.clear();
 
    QString spath;
    if(s)
        spath=s;
    else
        spath=".";
 
    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;
    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;
        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类型,创建相应的插件实例
                    return interfaces[i]->
                            create( mimeType, url, argumentNames, argumentValues);
            }
        }
    }
    return NULL; //如果没有,直接返回NULL,webkit会进行处理的
}

下面就可以开始编写插件库。首先我们定义插件的统一接口,然后每个插件类只需实现该接口就行了,这样有利于扩展插件库。

自定义的插件接口:

webkitplugininterface.h :

#ifndef WEBKITPLUGININTERFACE_H
#define WEBKITPLUGININTERFACE_H
#include <QWebPluginFactory>
 
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;
};
 
//声明WebKitPluginInterface为一个接口
Q_DECLARE_INTERFACE(WebKitPluginInterface, "com.plugin.uvchip.www/1.0")
#endif // WEBKITPLUGININTERFACE_H
 

上面的那段代码中的Q_DECLARE_INTERFACE() 是在定义接口是必须添加声明。下面是Qt对这个宏的说明:

Q_DECLARE_INTERFACE ( ClassName, Identifier )
This macro associates the given Identifier (a string literal) to the interface class called ClassName. The Identifier must be unique. 
下面我们开始实现这个接口:
我们将flashplugin编译成库,这样就可以供插件工厂WebkitPluginFactory加载访问了。

flashplugin.h :

#ifndef FLASHPLUGIN_H
#define FLASHPLUGIN_H
 
#if defined(FLASHPLUGIN_LIBRARY)
#  define FLASHPLUGINSHARED_EXPORT Q_DECL_EXPORT
#else
#  define FLASHPLUGINSHARED_EXPORT Q_DECL_IMPORT
#endif
 
#include "webkitplugininterface.h"
#include <QtPlugin>
 
class FLASHPLUGINSHARED_EXPORT FlashPlugin : public QObject, public WebKitPluginInterface  {
        Q_OBJECT
        Q_INTERFACES(WebKitPluginInterface) //声明WebKitPluginInterface是一个接口
    public:
        FlashPlugin(): WebKitPluginInterface(){};
        ~FlashPlugin(){};
        QList<QWebPluginFactory::Plugin> plugins()const ;
        QObject *create(const QString &mimeType,
                                const QUrl &url,
                                const QStringList &argumentNames,
                                const QStringList &argumentValues) const ;
 
};
#endif // FLASHPLUGIN_H

flashplugin.cpp :

#include "flashplugin.h"
 
#include <QTextEdit>
#include <QUrl>
#include <QDebug>
 
QList<QWebPluginFactory::Plugin> FlashPlugin::plugins()const
{
    QWebPluginFactory::MimeType mimeType;
    mimeType.name="application/x-shockwave-flash";
    mimeType.description=QObject::tr("flash");
    mimeType.fileExtensions.append(".flv");
    mimeType.fileExtensions.append(".f4v");
    mimeType.fileExtensions.append(".swf");
 
    QList<QWebPluginFactory::MimeType> mimeTypes;
    mimeTypes.append(mimeType);
 
    QWebPluginFactory::Plugin plugin;
    plugin.name=QObject::tr("External Video viewer plugin");
    plugin.description=QObject::tr("Use vlc to open video files !!!");
    plugin.mimeTypes=mimeTypes;
 
    QList<QWebPluginFactory::Plugin> plugins ;
    plugins.append(plugin);
    return plugins;
}
QObject *FlashPlugin::create(const QString &mimeType,
                const QUrl &url,
                const QStringList &argumentNames,
                const QStringList &argumentValues) const
{
    QTextEdit * edit= new QTextEdit();
    edit->setObjectName("我是插件");
    edit->setPlainText(mimeType + " :  " + url.toString() +"\n\n"
         +QString::fromUtf8("这里本来是需要adobeFlash插件的,")+"\n"
         +QString::fromUtf8("但现在替换成了我们自定义的插件(QTextEdit插件了)。") );
 
    Q_UNUSED(argumentNames);
    Q_UNUSED(argumentValues);
    qDebug()<<"create flash plugin";
    return edit;
}
 
//Q_EXPORT_PLUGIN2()必不可少,
//只有这样FlashPlugin插件类才为外部可见,插件名为WebkitPluginFlash
Q_EXPORT_PLUGIN2(WebkitPluginFlash, FlashPlugin)

Q_EXPORT_PLUGIN2 在Qt帮助文档中的说明如下:

Q_EXPORT_PLUGIN2 ( PluginName, ClassName )
This macro exports the plugin class ClassName for the plugin specified by PluginName. The value of PluginName should correspond to the TARGET specified in the plugin's project file.

There should be exactly one occurrence of this macro in the source code for a Qt plugin, 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插件了。

效果如下:

pluginView



分类: Qt

0
0

(请您对文章做出评价)

« 上一篇: Qt——web网页和本地对象的交互
» 下一篇: 【转】WebKit 分析–for android

Webkit简单写出源代码分析 今日研究了一下Webkit,这个东西是什么东西这里就不做描述了,看不懂就不必往下看了。这里是以Qt的代码分支为主进行的分析,复杂的分析个人也有,但是毕竟牵扯到一些机密问题,所以不便公开。     JaveScripeCore:执行JavaScrip的核心程序,里面包含了脚本解析器、分析器和执行程序。 WebCore:浏览器核心组件,可以看作为一个Http解析和显示的核心库,包括了 阅读详情

相关推荐

从零开始:使用VMOS Pro和Xposed绕过APP环境检测的完整指南

本文详细解析了使用VMOS Pro和Xposed框架绕过APP环境检测的完整技术方案,包括模拟器检测、Root环境检测和Hook框架检测的对抗方法。通过实战案例和代码示例,展示了如何利用Xposed Hook技术拦截检测逻辑,特别针对360加固等保护技术提供了解决方案。

ee345的博客 735

QtWebkit包含的类简介

前言 WebKit从Qt 4.4开始被作为一个Module被集成到Qt中。简单的说,Qt webkit就是Qt对Apple公司webkit的支持而开发的库,主要包括以下几个类: QWebDatabase:Access to HTML 5 databases created with JavaScript QWebFrame:Represents a frame in a...

aijia7039的博客 197

JAVA审批流程,一个简单表结构设计方案By OU

一、表结构设计1.流程表(process)用于存储审批流程的基本信息。字段名类型描述idBIGINT主键,流程IDname流程名称TEXT流程描述DATETIME创建时间DATETIME更新时间statusTINYINT(1)流程状态(0: 停用, 1: 启用)2.节点表(process_node)用于管理流程中的每个审批节点。字段名类型描述idBIGINT主键,节点IDprocess_idBIGINT流程ID,外键关联process.id。

1901

Qt中的QWebView

一、Webkit了解 Webkit是一个开源的浏览器引擎,chrome也使用了作为核心。Qt中对Webkit做了封装,主要有以下几个类: QWebView :最常用的类,作为一个窗体控件 QWebPage :包含在QWebView中,表示一个Document QWebFrame :包含在QWebPage中,表示一个Frame QWebSettings :网页渲染全局设置 QWebH...

weixin_30522183的博客 1202

【故障排查】telnet连接失败:端口23不可达的深度分析与解决方案

本文深度剖析了telnet连接失败,特别是端口23不可达的常见原因与系统性解决方案。文章从客户端本地配置、服务器端服务与防火墙、中间网络路径三个层面,提供了详细的排查步骤与命令,并强调了Telnet协议的安全风险,建议使用SSH等更安全的替代方案进行远程管理与端口测试。

weixin_29306011的博客 898

Claude Code(8):使用 skill-creator 打造属于测试人员的 Skills

本文介绍了如何使用Claude Code的skill-creator工具快速创建测试相关的Skills。skill-creator是一个专门用于创建新Skills的Skill,相比手动创建更高效。文章详细演示了安装skill-creator的步骤,并通过创建"测试计划编写助手"的实战案例,展示了如何通过对话方式定义Skill名称、触发条件和功能需求。skill-creator会自动生成完整的SKILL.md文件和目录结构,用户只需确认即可完成Skill创建。

blues_C的博客 526

Qt读写配置文件 QSettings类笔记

配置文件(Configuration file)一般以存在 config,ini命名。主要的结构是键值对的形式存储。节就是一组键值对的名字。配置文件的样子。Qt中读写配置文件用到的是QSettings类。这个类不止可以读配置文件,还有注册表等,详情见文档中QSettings::NativeFormat设置;构造方法公有方法。

m0_51409578的博客 874

白话讲解帕累托前沿点(Pareto Frontier)基础知识与实例解析

排除所有“劣解”,缩小决策范围;量化目标间的“权衡关系”(如“每增加1千元成本,续航提升多少小时”);支持不同场景下的个性化选择,平衡冲突目标。无论是手机选购、汽车设计,还是城市规划,帕累托前沿都是从“混乱的多目标”到“清晰的权衡”的关键桥梁,是现代决策科学中不可或缺的工具。通过数学建模,工程很多问题都可以建模成帕累托前沿求解问题,通过线性规划CPLEX、Gurobi 等优化工具,可以方便进行求解。

2138

QtWebKit播放flash的設置

m_webView = new QWebView(this); m_webView->page()->mainFrame()->setScrollBarPolicy(Qt::Horizontal,Qt::ScrollBarAlwaysOff); m_webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); con

星痕_Raphael 1507

unity从3D升级到urp管线,打包ab包后,材质全部变紫色

确保材质中的被转换为 URP 兼容的着色器。在打包 AssetBundle 时,确保所需的着色器被正确打包。确保运行 AB 包的目标项目中正确配置了 URP 渲染管线。如果加载后材质丢失,检查 AB 包的加载逻辑,确保材质正确应用了着色器。通过这些步骤,你应该能够解决从标准渲染管线切换到 URP 渲染管线后,材质在 AB 包中变紫色的问题。如果问题仍然存在,请根据具体错误日志进一步排查。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1962

威纶通触摸屏与S7-1200以太网通信的具体方法和步骤(非常详细)

威纶通触摸屏与S7-1200以太网通信的具体方法和步骤(非常详细)

Robot_PLC_HMI_Automation 1万+

QT的Webkit 编写插件

为了允许的QWebView加载插件,必须使能QWebView的Javascript和Plugins属性,使能方法为: QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptEnabled,true); QWebSettings::globalSettings()->setAttribute(QWebSetti

qiubye的专栏 952

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PyQt写的浏览单web页面的browser

PyQt写的浏览单web页面的browser PyQt写的浏览单web页面的browser - 代码分享 - 开源中国社区 巫云 PyQt写的浏览单web页面的browser 巫云 发布于 2011年06月13日 16时, 6评/2080阅 ...

225

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Qt webkit插件相关知识

1、在Qt中使用 WebKit 浏览器核心 使用 QtWebKit 需要在工程文件(*.pro)中加入: 1. QT+=webkit 2. QT+=network 2、QtWebKit的flash支持 QtWebKit到固定的路径(NPAPI插件厂商的安装路径)下载入flash控件,如果需要flash支持,确保一下文件存在:...

a821048508的博客 168

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

QT webkit plugin 开发示例

一、Fancybrowser 浏览器开发 1、webkitplugininterface.h #ifndef WEBKITPLUGININTERFACE_H #define WEBKITPLUGININTERFACE_H #include class WebKitPl

弹-room 2375

qt android webkit,关于Qt Webkit模块详细介绍

关于Qt Webkit模块详细介绍是本文要介绍的内容,主要是来学习webkit的使用方法,QtWebkit 模块提供了一个在Qt中使用web browser的engine,这使得我们在QT的应用程序中使用万维网上的内容变得很容易,而且对其网页内容的控制也可以通过native controls 实现。QtWebkit具有渲染HTML,XHTML和SVG 文档, 使用CSS排版,运行JavaScrip...

weixin_42398055的博客 534

设置Qt插件路径

设置Qt插件路径

m0_60259116的博客 1377

QT-WebKit flash 插件问题

<br />    目前开源网站上的 WebKit 已经提供了对 Flash 插件的支持。<br />    在 Windows 上,WebKit 会去读取注册表 HKEY_LOCAL_MACHINE/SOFTWARE/MozillaPlugins 位置上的插件,从而找到 插件动态库的位置,比如 C:/Windows/system32/Macromed/Flash/NPSWF32.dll 。在 Windows 上 WebKit 用到了三个接口:<br />NPError NP_Initialize(NPNe

link_nini的专栏 1071

QT-Webkit总览

最近一直在写一个基于QT-Webkit的浏览器插件,这个项目做了2个月了,一直是基于QT开发,也让自己对QT-Webkit有了一些了解,所以想把这些经验记录下来。 1 QT-Webkit介绍 QT-Webkit是将Webkit移植到QT的一个开源项目,目前最新的版本是QT-Webkit 2.2,其已经加入到QT 4.8中,正是由于这个开源项目,我们可以很方便的在QT中开发需要渲染网...

weixin_30599769的博客 281

QT 上WEBKIT 的文章

 今日研究了一下Webkit,这个东西是什么东西这里就不做描述了,看不懂就不必往下看了。这里是以Qt的代码分支为主进行的分析,复杂的分析个人也有,但是毕竟牵扯到一些机密问题,所以不便公开。     JaveScripeCore:执行JavaScrip的核心程序,里面包含了脚本解析器、分析器和执行程序。WebCore:浏览器核心组件,可以看作为一个Http解析和显示的核心库,包括

springsu的专栏 2281

Qt 显示透明flash和编写QtWebkit插件

Qt 有两种方法可以显示flash. 1. 通过QAxWidget 调用com形式显示flash, 需要本机安装IE flash插件 2. 直接通过qwebview显示flash, 需要下载webkit 的flash插件NPSWF32.dll 1. 通过IE显示flash 是通常做法.QAxWidget提供很方便的嵌入, 只是IE对页面的支持可能不是很好 但是QAxWidget有...

weixin_30485291的博客 317

[Qt5] 减少dll依赖和大小(特别是webkit的大小和依赖)

Qt5的依赖太多, 而且很dll非常大. 折腾了好久, 摸索了一些精简的方法. webkit是个非常蛋疼的东西, 依赖超多, 又很庞大. 所以需不需要webkit是完全不同的. 如何编译Qt5可以参考本人之前一篇文章http://www.cnblogs.com/lingdhox/p/3457419.html 一. 1. 在configure时去掉不需要的模块, 比如openssl,...

weixin_30482181的博客 1182
上一篇: Qt——web网页和本地对象的交互
下一篇: QTcpServer多线程实现
zdpyly21
博客等级 码龄12年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值