QtWebKit插件编程

让qtwebkit使用gstreamer 花了一天事件, 终于编译出了支持gstreamer的qtwebkit, 可以开始html5 的之旅了。  1. 编译libxml2 下载libxml2-sources-2.7.6.tar.gz 解包后在当前目录下编写如下编译脚本:(当然,不用脚本也行,你可以直接执行) CC=arm-none-linux-gnueabi-gcc ./configure --build=i686-linux 阅读详情

为了允许的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/xxl/FlashPlugin-build-desktop"; s

tatic 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, constQStringList & 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, publicWebKitPluginInterface

{

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中指定的位置为 constchar *s ="/home/nxx/FlashPlugin-build-desktop";)。

上面的插件库和前面的工厂类,QWebView对象组合在一起就可以实现:

当用QWebView打开包含了需要 mimeType.name="application/x-shockwave-flash"类型的插件的网页的时候,就会调用到我们自定义的flashplugin插件了。

效果如下:

pluginView

【LVGL】学习笔记--(3)界面切换以及显示优化 界面切换和帧率优化 阅读详情

相关推荐

光耦CTR参数实战:如何避免误触发与功耗陷阱(附计算公式)

本文深入解析光耦CTR参数在电路设计中的关键作用,探讨如何平衡误触发风险与功耗表现。通过TLP521、PC817等常见型号的实测数据对比,提供不同工作状态下的选型策略和计算公式,帮助工程师优化设计,提升系统稳定性和能效。

2a4s6d8f0g的博客 323

为QT的Webkit 编写插件

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

weixin_30240349的博客 2238

Carla自动驾驶仿真一:快速安装与运行Carla

网上有不少的Windows版本的Carla的安装教程,这里简单记录下自己安装过程,写的也比较详细,基本不用看其他文章。

zataji的博客 2万+

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

spring-ai学习(四)-MCP

创建一个springai项目1.依赖。

zql1455890112的博客 1386

Rockchip RK3568实战:手把手教你调试I2S音频驱动(附ALSA设备树配置详解)

本文提供Rockchip RK3568平台I2S音频驱动的实战调试指南。详细解析了从硬件连接到软件配置的全过程,重点涵盖ALSA驱动框架下的设备树配置、时钟计算、DMA参数设置以及常见问题(如无声、爆音)的排查与解决方法,帮助开发者快速定位并解决音频驱动难题。

weixin_28358083的博客 498

Qt中的QWebView

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

weixin_30522183的博客 1202

别再为多相机标定头疼了!用VisionMaster统一坐标系的保姆级教程

本文详细介绍了使用VisionMaster平台解决多相机视觉系统中坐标系统一问题的完整流程。从标定板选择到N点标定,再到实战演练,提供了从原理到落地的全方位指导,帮助工程师高效解决多相机定位引导中的坐标偏差问题。

weixin_38168322的博客 632

Qt读写配置文件 QSettings类笔记

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

m0_51409578的博客 874

微波无源器件 功分器1 新型方波导双模无功功分器

本名证明了一种基于有着特定功能的(dedicated)T性匹配元件(散射件)的进化结点的新型波导双模两路功分器的可行性。这个散射件,有着面向三个部分的匹配部分,提供了等效功分并且朝着对应的输出端口传输矩形波导的两个TE10/TE01正交模式。所提出的设计紧凑,易于比例变化并且能够级联来获得。

qq_45245770的博客 1391

bevformer详解(3): 逐行代码讲解

在这篇文章中,我们将从BEVFormer算法代码入手,深入探究BEV转换的流程。BEVFormer是一种基于Transformer的BEV转换模型,其核心思想是利用自注意力机制和交叉注意力机制,从,并通过Object Query与BEV特征的交互,完成3D目标检测和地图分割等任务。https://developer.baidu.com/article/details/3224715bevformer的网络结构由三部分组成, 模型结构所示,其中的是部分,对于的是的结构,对于部分,沿用的中的decoder部分,

@bangbang的博客 3701

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

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2025

obs-qtwebkit 项目常见问题解决方案

obs-qtwebkit 项目常见问题解决方案 一、项目基础介绍 obs-qtwebkit 是一个基于 QtWebkit 库的浏览器源插件,用于 obs-studio(一款开源的视频录制和直播软件)。此插件仅支持 Linux 系统,并且当前版本不支持与网页的交互,但未来可能会添加此功能。该项目主要使用 C++ 和 Makefile 编程语言。 二、新手常见问题及解决步骤 问题一:如何安装必要的依赖...

gitblog_00470的博客 898

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

qtwebkit如何使用plugin

在 Linux 平台上,WebKit 可以通过设置环境变量 QTWEBKIT_PLUGIN_PATH 来设置 Flash 插件的位置,程序会自动去读取目录里的 *.so 文件。或者你在 WebCore\plugins\PluginDatabase.cpp 文件的 Vector PluginDatabase::defaultPluginDirectories() 函数里设置一下它默认的位置。在平台上

RealPresence and Media Collaboration 专栏 734

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Qt实现简单的显示网页(QtWebkit、QtWebEngine、QAxWidget)

首先先说说QtWebkit、QtWebEngine、QAxWidget三种方式显示网页的应用场景 QtWebkit:在Qt5.6以前,都是使用QtWebkit组件,但Qt5.6以后,移除了QtWebkit这个组件 QtWebEngine:Qt5.6以后的MSVC版本,引进了基于Chromium的浏览器引擎 QtWebEngine QAxWidget:Qt5.6以后的mingw版本,由于移除了QtW...

qq_36651243的博客 4万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

QtWebkit 插件使用方法

Technorati 标签: Qt webkit 插件 播放flash QtWebkit支持传统的Netscape Plugin,要求先允许插件支持,该选项是: QWebSettings::PluginsEnabled 然后Qt就会在以下路径中查找插件: Linux/Unix (X11) .mozilla/plugins in the user's home dire...

weixin_30680385的博客 237

开源项目推荐:基于QtWebkit的OBS浏览器源插件

开源项目推荐:基于QtWebkit的OBS浏览器源插件 在寻找为你的直播添加动态网页内容的解决方案吗?尽管该项目已被废弃,但了解历史上的创新可以激发新的灵感或找到替代方案。让我们一同回顾曾备受瞩目的OBS浏览器源插件(基于QtWebkit),它专为Linux用户设计,尽管目前不再维护,但其设计理念和功能仍然值得学习和探讨。 项目介绍 这是一个专为OBS Studio打造的浏览器源插件,利用了强大的...

gitblog_00104的博客 432

QtWebkit插件设计(下)

在QtWebkit插件设计(上)中已经介绍了插件设计中MIME类型为application/x-qt-plugin或者application/x-qt-styled-widget的情况,...

150

QtWebkit的插件Plugin设计实现

Qt Webkit中浏览器插件Plugin设计实现是我们要介绍的内容,我们都知道浏览器中有一套由Netscape浏览器传承下来的插件接口, 包括webkit,firefox都是支持的,但是那个开发起来比较困难,并且是平台相关的,借助于Qt的跨平台的特性,可以方便地为Qt开 发出一套跨平台的插件。       QtWebkit中插件可以有两种,一种Mime必须是applica

600

QtWebKit Module

QtWebKit Module Qt 4.6: QtWebKit ModuleQtWebKit ModuleThe QtWebKit module provides a web browser engine as well as classes to render...

139

QtWebKit插件设计(上)

QtWebkit插件的设计可以分为两种情况。一种是MIME类型是application/x-qt-plugin或者application/x-qt-styled-widget,而另一种却...

149

Python-webkit2png vs 其他截图工具:为什么选择QtWebKit方案

Python-webkit2png是一款基于QtWebKit的网页截图工具,能够轻松捕获网页的完整画面,包括动态内容和Flash元素。相比传统截图工具,它提供了更强大的渲染能力和更灵活的使用方式,成为开发者和普通用户进行网页截图的理想选择。 ## 📌 核心优势:QtWebKit方案的独特价值 ### 1. 真正的浏览器级渲染能力 与基于简单截图API的工具不同,Python-webkit2p

gitblog_00199的博客 788

QtWebkit嵌入flash的总结(mac平台)

1、前言:     flash是adobe公司的闭源产品,在各平台的渲染都是通过插件来进行的(如windows下的flash.ocx,linux下的libflashplugin.so和mac下的Flash_Plugin),插件可以在adobe的网站上获取。当然也有开源(如gnash)或商业项目(如scaleform)来自行对flash进行解码渲染。我使用qtwebkit嵌入flash主要是因

lang55j9z的专栏 920

浅析obs-qtwebkit项目:为OBS Studio增添网页源功能

浅析obs-qtwebkit项目:为OBS Studio增添网页源功能 1. 项目基础介绍 obs-qtwebkit 是一个开源项目,旨在为著名的开源视频直播和屏幕录制软件OBS Studio添加一个基于QtWebkit的浏览器源插件。该项目的编程语言主要是 C++,同时包含了 Makefile 文件来辅助编译过程。 2. 项目的核心功能 该插件的核心功能是允许用户在OBS Studio中使用基于...

gitblog_00732的博客 412
上一篇: 用Qt开发Web和本地混合的应用
下一篇: Openssl的安装
jake2012
博客等级 码龄17年 32粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值