一. 介绍
在浏览器扩展或者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