由于QWebFrame 提供了一個addToJavaScriptWindowObject()接口, 所以在QT Webkit下添加一個自定義的
Javascript對象就變得非常的容易,要注意在跨頁面的時候,該對象會被清除,所以你只要重新加回來
就可以了, 這一點跟GTK類似, 只要捕獲WindowObjectCleared信號,在該信號處理函數(shù)里面執(zhí)行
addToJavaScriptWindowObject()就可以了。
這種方法不用去修改Webkit的核心代碼WebCore或者JavascriptCore, 所有工作都在應(yīng)用層面實現(xiàn),
可以說是簡單又實用。
具體可以參考如下源代碼:
// 實現(xiàn)一個新類
class QFoo : public QObject
{
Q_OBJECT
public:
QFoo(QObject *parent) {}
void initialize(QWebView *wv);
public slots:
void print(const QString &msg);
private slots:
void addObject();
private:
QWebFrame *wf;
};
void QFoo::setWebView(QWebView *wv)
{
wf = wv->page()->mainFrame();
// Add to the javascript window object
addObject();
// connect the signal for javascript window object cleared, which happened
// at page switching etc.
connect(wf, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(addObject()));
}
void QFoo::addObject()
{
wf->addToJavaScriptWindowObject(QString("QFoo"), this);
}
void QFoo::print(const QString &msg)
{
qDebug() << "Output the message " << msg;
}
// 測試主函數(shù)
int main(int argc, char *argv[])
{
QApplication test(argc, argv);
QWebView *wv = new QWebView();
QFoo *foo = new QFoo(wv);
foo->initialize(wv);
wv->setUrl(QUrl("foo.html"));
wv->show();
return test.exec();
}
HTML測試代碼很簡單:
<script>
QFoo.print("Hello world!");
</script>