在QtWebkit的javascript里訪問QObject的最關鍵的關鍵就是下面這個方法:
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的方法, 還有一個重要的條件需要滿足, 那就是把這個方法聲明為槽函數(而且是public槽), 普通的函數是不行的!
要想在js里直接訪問到QObject的成員, 該成員必須定義為屬性才行!?? 而這個QObject不一定非得是QWidget, 可以是任何QObject及其派生類的實例。
滿足了上面的條件我們就可以在js里調用formExtractor的函數啦:
<form onsubmit=”formExtractor.submit()”>
這里和調用任何js的變量和函數都是一致的, 具體看看js的語法就行了。
http://blog.sina.com.cn/s/blog_671732440100utzp.html
讓QtWebKit使用緩存
QNetworkDiskCache *diskCache=newQNetworkDiskCache(this);
QString location=QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
diskCache->setCacheDirectory(location);
this->ui->wndHtmlView->page()->networkAccessManager()->setCache(diskCache);
QDesktopServices::storageLocation(QDesktopServices::CacheLocation);返回的是系統的緩存目錄的路徑
http://blog.sina.com.cn/s/blog_671732440100utyl.html