您的位置:首页 > 移动开发 > Objective-C

Qt webKit--实现本地QObject(c++)和JavaScript交互

2012-04-17 16:12 573 查看
这一篇我们将实现JavaScript和本地的QObject的交互。在阅读本篇之前需要对Qt的信号和槽机制和JavaScript有简单的了解。

Qt本地对象和JavaScript交互分为三个步骤

将本地QObject暴露给webkit和JavaScript
将本地QObject的信号和JavaScript的槽连接起来
通过JavaScript调用本地QObject的槽



也就是第1步和第2步结合起来实现 本地QObject的信号和JavaScript的槽连接

第1步和第3步结合起来实现 通过JavaScript调用本地QObject的槽

下面我们就分别看一下第1、2、3步分别如何实现的。

1、将本地QObject暴露给Webkit。主要分为以下几个步骤。

新建一个QObject, 命名为simpleQObject,包含信号和槽。其头文件如下:

#include <QtCore/QObject>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QVariant>
class SampleQObject : public QObject
{
Q_OBJECT
public:
SampleQObject(QObject *parent = 0);
signals: /* 声明QObject signals */
void signal(QMap<QString, QVariant> object);
public slots: /*声明 QObject slots */
QMap<QString, QVariant> slotThatReturns(const QMap<QString,
QVariant>& object); //QObject 的槽,用来返回字符串
void slotThatEmitsSignal(); //QObject的槽,用来发射信号,并且记录发射次数
private:
int m_signalEmited;
QMap<QString, QVariant> m_returnObject;
QMap<QString, QVariant> m_emitSignal;
};

创建实现函数。mainwindow.h 和 mainwindow.cpp。 mainwindow.h代码如下

#include <QMainWindow>
#include "sampleqobject.h“
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
/*声明 将 QObject 暴露给 Qt WebKit 的函数*/
void addJavaScriptObject();
protected:
void changeEvent(QEvent *e);
private:
Ui::MainWindow *ui;
SampleQObject* m_sampleQObject;
};

mainwindow.cpp关键代码如下:

//当网页被载入或者刷新时,将暴露给webkit的QObject和webkit JavaScript连接
connect(ui->webView->page()->mainFrame(),
SIGNAL(javaScriptWindowObjectCleared()),
this, SLOT(addJavaScriptObject()));

void MainWindow::addJavaScriptObject()
{
//addJavaScriptObject函数的实现:将simpleQObject和webkit JavaScript连接
this->ui->webView->page()->mainFrame()->addToJavaScriptWindowObject
("sampleQObject“, this->m_sampleQObject);
}

2. 将本地QObject的信号和JavaScript的槽连接起来



如何发射QObject信号。

signals:
void signal(QMap<QString, QVariant> object);
public slots:
void slotThatEmitsSignal();
/* this slot is designed to emit signals and count emit times*/
void SampleQObject::slotThatEmitsSignal()
{
qDebug() << "SampleQObject::slotThatEmitsSignal";
this->m_signalEmited++; /* count emit times */
this->m_emitSignal.clear();
this->m_emitSignal["signalsEmited"] = QVariant(this->m_signalEmited);
this->m_emitSignal["sender"] = QVariant("SampleQObject::slotThatEmitsSignal");
qDebug() << "SampleQObject::slotThatEmitsSignal" << this->m_emitSignal;
/* 发射信号 */
emit signal(this->m_emitSignal);
}

JavaScript槽的实现

$(document).ready(function() {
try {
/* 将sampleQObjects的signal 和 JavaScript slot 连接起来*/
sampleQObject.signal.connect(slot);
/* 当simpleQObject发射信号时调用JavaScript的槽 */
sampleQObject.slotThatEmitsSignal();
}
catch(e) {
alert(e);
}
});
/* slot函数将会输出 SimpleQObject has emited signal ? times */
function slot(object) {
var objectString = object.sender +
" has emited signal " +
object.signalsEmited +
" times.";
alert(objectString);
}

Run the app。



当点击刷新时,弹出新的对话框:



3. 通过JavaScript调用本地QObject的槽



JavaScript信号发射

try {
var object = {intValue: 1};
/* 声明一个JavaScript object并用simpleQObject的槽的返回值赋值它*/
var returnedObject = sampleQObject.slotThatReturns(object);
/* 输出 "1 added bonus"*/
alert(returnedObject.stringValue);
}

QObject 槽函数

QMap<QString, QVariant> SampleQObject::slotThatReturns(const QMap<QString, QVariant>& object)
{
qDebug() << "SampleQObject::slotThatReturns";
this->m_returnObject.clear();
this->m_returnObject.unite(object);
QString addedBonus = QString::number(object["intValue"].toInt(),
10).append(" added bonus.");
this->m_returnObject["stringValue"] = QVariant(addedBonus);
qDebug() << "SampleQObject::slotThatReturns" << this->m_returnObject;
return this->m_returnObject; // 返回m_returnObject包含有字符串 1 added bonus

}

Run the app



本例子代码下载地址: http://software.intel.com/file/28111
http://software.intel.com/file/28112

注:本例子中部分代码来自wiki.forum.nokia.com
http://wiki.forum.nokia.com/index.php/Exposing_QObjects_to_Qt_Webkit
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: