【引用】Qt——web网页和本地对象的交互

摘要:
有时您可能需要在html页面中调用本地对象方法。1、 通过html中的JavaScript调用Qt本地对象方法的过程如下:将本地QObject对象暴露给webkit,JavaScript通过JavaScript调用本地QObject。每个步骤都在槽中进行了详细分析:1.将本地QObject对象暴露给webkit和JavaScript QWebFrame。提供了该函数的接口:1voidaddToJavaScript WindowObject;Qt的帮助文档中对该方法进行了如下描述:在框架的JavaScript上下文中使对象可用。对象将作为框架摆动对象的子对象插入。Qtproperties将被导出为JavaScript属性和许多JavaScript方法。如果您希望确保您的QObjects在加载新URL时仍然可以访问,则应将它们添加到连接到javaScriptWindowObjectCleared()信号的插槽中。如果此页面未启用Javascript,则此方法无效。QtWebKit不会明确删除这些对象。由此可见,为了使addToJavaScript WindowObject方法有效,它必须支持javascript;为了确保每次打开新页面或刷新页面时都调用此方法,应将此方法与JavaScriptWindowObjectCleared信号连接。

有时候可能需要在html网页中调用本地的对象方法。

比如说我点击了一个视频文件的链接,希望调用本地的多媒体模块来播放这个视频文件, 如何实现?

一、html中的JavaScript调用Qt本地对象方法

过程如下:

  1. 将本地的QObject对象暴露给webkit和JavaScript
  2. 通过JavaScript调用本地QObject的槽

下面对每个步骤进行详细的分析:


1、将本地的QObject对象暴露给webkit和JavaScript

QWebFrame里提供了实现这个功能的接口:

1void addToJavaScriptWindowObject(const QString &name, QObject *object, QScriptEngine::ValueOwnership ownership);

Qt的帮助文档中对这个方法的说明如下:

Make object available under name from within the frame's JavaScript context. The object will be inserted as a child of the frame's window object.

Qt properties will be exposed as JavaScript properties and slots as JavaScript methods.

If you want to ensure that your QObjects remain accessible after loading a new URL, you should add them in a slot connected to the javaScriptWindowObjectCleared() signal.

If Javascript is not enabled for this page, then this method does nothing.

The object will never be explicitly deleted by QtWebKit.

从这里可以看出,要想addToJavaScriptWindowObject方法有效,必须是能javascript;为了保证每次打开个新网页或刷新网页时都调用这个方法,那就应该将这个方法和javaScriptWindowObjectCleared信号相连。

相关代码如下:

webkit_vlc.h

#ifndef WEBKIT_VLC_H 
#define WEBKIT_VLC_H 
#include <QWidget> 
#include <QWebView> 
#include "obj_openvlc.h" 
namespace Ui { 
    class Webkit_VLC; 
} 
class Webkit_VLC : public QWebView 
{ 
    Q_OBJECT 
public: 
    explicit Webkit_VLC(QWidget *parent = 0); 
    ~Webkit_VLC(); 
private slots: 
    void addJavaScriptObject(); 
private: 
    Ui::Webkit_VLC *ui; 
    Obj_OpenVlc *obj_openVlc; //将暴露给javascript的对象 
}; 
#endif // WEBKIT_VLC_H 

webkit_vlc.cpp

#include "webkit_vlc.h" 
#include "ui_webkit_vlc.h" 
#include <QWebPage> 
#include <QWebFrame> 
#include <QtDebug> 
Webkit_VLC::Webkit_VLC(QWidget *parent) : 
    QWebView(parent), 
    ui(new Ui::Webkit_VLC) 
{ 
    setWindowFlags( Qt::FramelessWindowHint); 
    ui->setupUi(this); 
    resize(1280,720); 
    obj_openVlc = new Obj_OpenVlc(this); 
    settings()->setAttribute(QWebSettings::JavascriptEnabled,true); 
    settings()->setAttribute(QWebSettings::PluginsEnabled,true); 
    connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared ()), 
            this, SLOT(addJavaScriptObject())); 
    load(QUrl("file:///home/nxx/Webkit_VLC/view.html")); 
} 
Webkit_VLC::~Webkit_VLC() 
{ 
    delete ui; 
} 
void Webkit_VLC::addJavaScriptObject(){ 
    qDebug()<<"addJavaScriptObject"; 
    //javascript可以通过对象名obj_open_vlc访问obj_openVlc对象。 
    page()->mainFrame()->addToJavaScriptWindowObject("obj_open_vlc",this->obj_openVlc); 
} 

现在已经将名为“obj_open_vlc”的对象暴露给了webkit的javascript, 这个对象名对应的是本地的一个类的对象

Obj_OpenVlc *obj_openVlc.

下面的代码为这个类的实现,并且类中定义了一个槽供webkit的javascript调用。

obj_openvlc.h

#ifndef OBJ_OPENVLC_H 
#define OBJ_OPENVLC_H 
#include <QObject> 
class Obj_OpenVlc : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Obj_OpenVlc(QObject *parent = 0); 
signals: 
public slots: 
    //供javascript调用的槽 
    QString openVLC(QString url); 
}; 
#endif // OBJ_OPENVLC_H 
obj_openvlc.cpp
#include "obj_openvlc.h" 
#include <QtDebug> 
Obj_OpenVlc::Obj_OpenVlc(QObject *parent) : 
    QObject(parent) 
{ 
} 
QString Obj_OpenVlc::openVLC(QString url) 
{ 
    qDebug()<<"open "<< url; 
    return url; 
} 

2、在html中通过JavaScript调用本地QObject的槽

html的代码如下:

view.html

<html>
<script LANGUAGE="JScript">  
   function open()
   {
       try{
             var url = obj_open_vlc.openVLC("192.168.0.1/webroot/test.f4v");
             alert(url);
       }
       catch(e) {
            alert(e);
       }
  }

</script>

  <body>
    <h1>Open VLC</h1>
    <input type=button value="open" onclick="open()">
  </body>
</html>
这个html中通过javascript代码

obj_open_vlc.openVLC("192.168.0.1/webroot/test.f4v");

调用了本地类Obj_OpenVlc的对象obj_openVlc的槽(方法)openVLC()。

这样子就实现了在webkit的html网页中的,通过javascript调用本地对象的方法。

二、Qt本地对象调用html中的javascript方法

目前我知道的有两种方法:

1. 通过QWebFrame类的槽:

QVariant QWebFrame::evaluateJavaScript ( const QString & scriptSource )

来直接调用javascript中的方法, 比如我html网页中有个javascript  的 loadFinished()方法 , 那么就可按下面的方式直接调用:

webView->page()->mainFrame()->evaluateJavaScript("loadFinished();");

这里假设 webView 是 QWebView类的对象。

2.将本地OBject的信号和javascript的方法相连。

当本地发射出这个信号时,也会调用javascript的方法。不过这里需要在javascript中加入类似下面的代码。

//将Qt本地对象 obj_open_vlc的信号与 javascript的函数slotButtonClicked相连 
obj_open_vlc.ObjSignal.connect(slotLinkClicked);

此处的 ObjSignal 是Qt本地对象obj_open_vlc的一个信号,slotButtonClicked 是javascipt 中的一个方法。之后,如果本地obj_open_vlc 对象执行 emit ObjSignal() 之后就会调用javascipt的方法slotLinkClicked()。

这里贴上相关的html的代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<title>Media Server</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script language="javascript">
//将Qt本地对象 obj_open_vlc的信号与 javascript的函数slotButtonClicked相连 
obj_open_vlc.ObjSignal.connect(slotLinkClicked);
function slotLinkClicked()
{
    alert("link is clicked!");
}  
function loadFinished()
{
    alert("page load finished!");
} 
function getRTMPHost()
{
    if (location.protocol == "http:" || location.protocol == "https:")
        return "/" + location.hostname + "/";
    else
        return "";
} 
function open(file)
{
    url = 'rtmp:/' + getRTMPHost() + 'vod/' + file
    try {
          var play = obj_open_vlc.openVLC(url);
          //alert(play);
      }
      catch(e) {
          alert(e);
      }
} 
</script>
  <body>
    <h1>Media Server</h1>
    <p><a href="javascript:open('test1.f4v');">test1.f4v</a></p>
    <p><a href="javascript:open('test2.f4v');">test2.f4v</a></p>
  </body>
</html>

免责声明:文章转载自《【引用】Qt——web网页和本地对象的交互》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VS2008如何添加 "OLE/COM 对象查看器" .PHP解决跨域问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【python 3.6】从网站抓图并存放到本地路径

#!/usr/bin/python # -*- coding: UTF-8 -*- _author_ = 'BH8ANK' import urllib.request import re import os import time #os.rmdir("D:/images") #1,打开页面,读取图片张数,抓html wangzhi = "https...

JavaScript特效——开关灯泡

准备 首先要准备两张图片,一张是灯泡亮的图片,取名为on.jpg,另一张是灭的图片,取名为off.jpg,都放置到当前的目录下。 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-...

4种解决json日期格式问题的办法

转自:http://www.cnblogs.com/best/p/3537030.html 开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示: //设置服务器响应的结果为纯文本格式 conte...

html页面跳转

https://blog.csdn.net/zaynahly/article/details/75434874 JS跳转页面参考代码 第一种: <script language="javascript" type="text/javascript"> window.location.href="http://t.zoukankan.com/lo...

关于JAVASCRIPT中的DATASET

DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以...

JavaScript-Runoob:JavaScript 数据类型

ylbtech-JavaScript-Runoob:JavaScript 数据类型 1.返回顶部 1、 JavaScript 数据类型 值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。 引用数据类型:对象(Object)、数组(Array)、函数(Fu...