QWebview的一些問題

在使用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文件。

imageformats文件夾

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章