void QWebFrame::addToJavaScriptWindowObject ( const QString& name, QObject * object )
我們要在js調用該QObject之前調用這個函數。 這個時機不好掌握, 不過我們可以按文檔的建議, 把這個函數放在一個signal的槽裏調用。 代碼如下:
/// in constructor ///
connect(ui.webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
this, SLOT(populateJavaScriptWindowObject()));
/// slot ////
void FormExtractor::populateJavaScriptWindowObject()
{
ui.webView->page()->mainFrame()->addToJavaScriptWindowObject(“formExtractor”, this);
}
addToJavaScriptWindowObject的第一個參數是對象在javascript裏的名字, 可以自由命名, 第二個參數是對應的QObject實例指針。 這樣在javascript裏就可以直接訪問formExtractor對象拉, 就像在Qt裏訪問這個formExtractor一樣, 是不是看上去超級簡單? 當然事情不會總是怎麼簡單的。 如果我們翻開Qt文檔關於addToJavaScriptWindowObject的說明就會發現, 還有一點非常重要的內容在文檔中僅僅是一筆帶過, 不注意看很可能就錯過了重要的信息:
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.
有沒有意識到藍色字體顯示的這句話意味着什麼呢? 大概聰明的同學們都已經意識到了吧。 要想在js裏調用Qt的方法, 還有一個重要的條件需要滿足, 那就是把這個方法聲明爲槽函數, 普通的函數是不行的! 要想在js裏直接訪問到QObject的成員, 該成員必須定義爲屬性纔行! 而這個QObject不一定非得是QWidget, 可以是任何QObject及其派生類的實例。 滿足了上面的條件我們就可以在js裏調用formExtractor的函數啦:
<form οnsubmit=”formExtractor.submit()”>
這裏和調用任何js的變量和函數都是一致的, 具體看看js的語法就行了。