[Qt] 利用QtWebKit完成JavaScript访问C++对象

一. 介绍         

 在浏览器扩展或者WebApp的项目经常用的脚本语言javascript有很多局限性,比如,javascript语言不能够夸窗口访问js对象,不能直接读写磁盘文件(这个也正是发明人设计的安全机制吧,要不然,谁还敢用浏览器啊,几行代码就可以把你偷窥的一览无余),我们可能在我们的程序中需要扩展这个功能。


那么,我们怎么解决这些问题呢?或许你可以参考一下下面的设计架构。


UI利用Html + CSS + JavaScript编写,核心业务层利用C++编写,C++和JavaScript对象主要通过WebKit通信。让相应的语言做它们擅长的事情,这就是这种架构的核心。


WebKit又是什么呢?简单言之就是一种浏览器内核引擎,Safari、Chrome、FireFox等浏览器都采用WebKit引擎作为内核,由此可见WebKit的地位了,我们正是利用WebKit来做javascript的扩展的,Qt界又对WebKit做了一层封装,这样,开发者对WebKit就更加容易上手了。


更幸运的是,QtWebKit提供了一种将QObject对象扩展到Javascript运行环境的机制,这样,JavaScript代码将有权限访问QObject对象, QObject对象的所有属性也能在Javascript上下文中被访问。


那么,如何利用QtWebKit使得js和c++相互通信呢?


二. 搭建框架

首先,我们需要一个js代码能够运行的环境

我们准备一个主窗口,在主窗口内部添加WebView控件,使得程序具有执行js的能力;

MainWindow的定义

#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsWebView>
#include <QGraphicsScene>
#include <QEvent>

#include "External.h"

class MainWindow : public QGraphicsView
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    virtual ~MainWindow();

private:
    QGraphicsWebView*   m_pWebView;
    QGraphicsScene*     m_pScene;
};

#endif // MAINWINDOW_H

MainWindow的实现

#include "mainwindow.h"

#include <QWebFrame>
#include <QLayout>

MainWindow::MainWindow(QWidget *parent)
    : QGraphicsView(parent)
{
    this->resize( QSize( 800, 600) );
    
    m_pScene = new QGraphicsScene(this);
    if(NULL != m_pScene)
    {
        m_pWebView = new QGraphicsWebView;

        if( NULL != m_pWebView)
        {
            //enabled javascript
            QWebSettings *settings = m_pWebView->page()->settings();

            settings->setAttribute(QWebSettings::JavascriptEnabled,true);  
            settings->setAttribute(QWebSettings::JavascriptCanAccessClipboard,true);
            settings->setAttribute(QWebSettings::DeveloperExtrasEnabled,true);
            settings->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, true);
            setti
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值