在使用QT4.8的QWebView中,遇到了一些問題,在這記錄下問題與相關的解決辦法。
1. 自定義cookie設置
在QwebView中想設置使用自定義的Cookie或者處理Cookie,用QNetworkCookieJar替換掉默認的。
QNetworkCookieJar *mCookieJar = new QNetworkCookieJar;
mWebView->page()->networkAccessManager()->setCookieJar( mCookieJar ); // 將設置爲自己
// 添加Cookie
QNetworkCookie mCookie(key, value); // 如 key爲 "id", value爲"123", cookie會是"id = 123"
QList<QNetworkCookie> cookieList;
cookieList.append(mCookie);
mWebView->page()->networkAccessManager()->cookieJar()->setCookiesFromUrl(cookieList, url);
2. QUrl 帶分號出錯 %
QString urlStr("http://example.com/?q=a%2B%3Db%26c");
original(urlStr); // %會被糾正爲%25,導致接下來load錯誤
原因 :
QUul解析模式控制 QUrl 解析字符串的方式;
默認使用QUrl::TolerantMode解析,會將未編碼的空格字符視爲等同於 "%20"; 並且將單個 "%" 字符當成百分比字符,替換成"%25";
另外一種是 QUrl::StrictMode解析,就只接受有效的URL,不會有糾正行爲。
解決辦法:
QString urlStr("http://example.com/?q=a%2B%3Db%26c");
QUrl mUrl = QUrl::fromEncoded(urlStr.toLatin1(), QUrl::StrictMode);
QString realUrl = mUrl.toEncoded();
//realUrl == urlStr
3. 圖片無法加載顯示
在瀏覽網頁的時候,發現jpg圖片一直加載不出來,顯示默認錯誤圖片,最後終於在stackoverflow找到答案,原來qwebview缺少了圖片格式解析。
只要將qt下plugins的imageformats文件夾放置在運行目錄下即可,其實只需要裏面的dll文件。
4. 與js交互
js調用qwebview:
(1). 設定支持js
mWebView->setAttribute(QWebSettings::JavascriptEnabled,true);
(2). 設定js對象名字
populateJavaScriptWindowObject();
connect(mWebView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(populateJavaScriptWindowObject()));
// 在發生javaScriptWindowObjectCleared時候,再次注入,不然怕沒有收不到js回調
void populateJavaScriptWindowObject()
{
mWebView->page()->currentFrame()->addToJavaScriptWindowObject(“QtQuery”, this);
// QtQuery是js設定對象的名字
}
(3) 建立信號槽
public slot:// 設定爲public
void jsCall(const QString param);
// js的調用方式是:QtQuery.jsCall("hello world")
QT 調用 JS 函數
如調用js的test函數
mWebView->page()->mainFrame()->evaluateJavaScript("test()");
<br />
ps: 在使用中發現,qwebview在加載js時候會有卡頓的現象,而使用cef則更加流暢,並且cef可以設置在單獨的進程運行,如果可以的話還是建議使用cef。