锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓嬮潰鍏堣涓涓嬶紝濡備綍鍒涘緩涓涓畝鏄撶殑嫻忚鍣?br />閫氳繃VS2008+QTSDK錛屽垱寤轟竴涓猶t4 GUI宸ョ▼:
璁頒綇錛屼竴瀹氳閫変笂QtWebKit鍜孮Network(榪欎釜鍚庨潰瑕佺敤鍒?...
鍐欏涓嬩竴孌典唬鐮侊紝涓涓祻瑙堝櫒灝卞仛鎴愪簡(jiǎn):
main.cpp
#include <QtGui/QApplication>
2#include <QWebView>
3#include <QMainWindow>
4
5int main(int argc, char *argv[])
6{
7 QApplication a(argc, argv);
8 QMainWindow window;
9 QWebView view(&window);
10 view.setGeometry(0, 0, 600, 400);
11 view.setUrl(QUrl("http://www.shnenglu.com/boymaster"));
12 window.show();
13 return a.exec();
14}
15
榪涘叆姝i?shù)簡(jiǎn)锛屾帴涓嬫潵浠嬀l嶄竴涓嬶紝濡備綍瀹炵幇js涓嶤++鐨勫弻鍚戣皟鐢?br />榪欓噷錛屼粎浠嬬粛寮鍙戜腑鐢ㄥ埌鐨勪竴縐嶈皟鐢ㄦ柟寮忥紝 鐢≦WebFrame鐨刟ddToJavaScriptWindowObject鏂規(guī)硶
涓漢姣旇緝鎺ㄨ崘榪欑鏂瑰紡錛屾槗涓虹悊瑙~~
1. JS濡備綍璋冪敤C++鍑芥暟錛岃瑙佷唬鐮亊~~
myobject.h
#ifndef MYOBJECT_H
2#define MYOBJECT_H
3
4#include<QObject>
5#include<QWebPage>
6#include<QWebFrame>
7
8// !! ATTENTION !! : The object do NOT need to inherit from QWidget anymore.
9class MyObject :public QObject {
10 Q_OBJECT
11private:
12 QWebPage *page;
13public:
14 MyObject(QWebPage *page) : page(page) { }
15public slots:
16 void func(QString arg) {
17 this->page->mainFrame()->evaluateJavaScript("document.body.innerHTML += '" + arg + "';");
18 }
19};
20
21#endif // MYOBJECT_H
22
main.cpp
#include <QtGui/QApplication>
2#include <QMainWindow>
3#include <QWebView>
4#include <QWebPage>
5#include <QWebFrame>
6#include "MyObject.h"
7
8int main(int argc, char *argv[])
9{
10 QApplication a(argc, argv);
11 QMainWindow window;
12 QWebView view(&window);
13 QWebPage page;
14 view.setPage(&page);
15 view.setGeometry(0, 0, 600, 400);
16 MyObject obj(&page);
17 page.mainFrame()->addToJavaScriptWindowObject("qt", &obj);
18 QString content("<script>function f() { qt.func('http://www.shnenglu.com/boymaster'); }</script>");
19 content += "<a href='javascript:f()'>Click Me</a>";
20 view.setContent(content.toAscii());
21 window.show();
22
23 return a.exec();
24}
25
2.C++璋冪敤JS鑴氭湰
myobject.h
class MyObject :public QObject {
2 Q_OBJECT
3
4private:
5 QWebPage *page;
6 QTimer *timer;
7
8public:
9 MyObject(QWebPage *page) : page(page) {
10 timer = new QTimer;
11 connect(timer, SIGNAL(timeout()), this, SLOT(slotTimerOut()));
12 timer->start(1000);
13 }
14
15signals:
16 void signalObjTimerOut();
17
18private slots:
19 void connectSlots() {
20 page->mainFrame()->evaluateJavaScript("DevObject.signalDevObjTimerOut.connect(f);");
21 }
22
23 void slotTimerOut() {
24 emit signalObjTimerOut();
25 }
26};
27
28#endif // MYOBJECT_H
main.cpp
int main(int argc, char *argv[])
2{
3 QApplication a(argc, argv);
4 QMainWindow window;
5 QWebView view(&window);
6 QWebPage page;
7 view.setPage(&page);
8 view.setGeometry(0, 0, 600, 400);
9 MyObject obj(&page);
10 QObject::connect(&view, SIGNAL(loadFinished(bool)), &obj, SLOT(connectSlots()));
11 page.mainFrame()->addToJavaScriptWindowObject("qt", &obj);
12 QString content("<SCRIPT>function f() { document.body.innerHTML += 'http://www.shnenglu.com/boymaster'; }</SCRIPT>");
13 view.setContent(content.toAscii());
14 window.show();
15 return a.exec();
16}
17
榪欐牱錛岄〉闈㈠姞杞藉悗錛孋++鐨凾imer姣忛殧1縐掑氨浼?xì)璋冪敤鍒癑S鐨刦()鍑芥暟
]]>
Qt鎻愪緵浜?jiǎn)鏈?C++瀵硅薄涓嶫avaScript鐨勬棤緙濋泦鎴愶紝鏄繘琛屾湰鍦頒笌web娣峰悎搴旂敤寮鍙戠殑鐞嗘兂騫沖彴銆?br />
(涓錛塓t Webkit 闆嗘垚
銆銆鍒╃敤Qt鐨刉ebkit 闆嗘垚涓嶲tNetwork妯″潡錛屼綘瀹屽叏鍙互榪涜鏈湴妗岄潰涓巜eb娣峰悎搴旂敤寮鍙戯紝浣犲彲浠ヨ嚜鐢卞湴娣峰悎JavaScript錛屾牱寮忚〃錛學(xué)eb鍐呭鍜孮t緇勪歡銆?Webkit鏄竴涓潪甯告垚鐔熺殑web嫻忚寮曟搸銆俀t涓泦鎴愪簡(jiǎn)榪欎釜澶у悕榧庨紟鐨勫紩鎿庯紝閫氳繃錛眛Webkit錛屼綘鍙互鍦跡++ 涓墽琛孞avaScript錛屾垨鑰呭湪緗戦〉涓泦鎴愶跡++瀵硅薄錛屽茍涓旈氳繃JavaScript鍜岃繖浜涘璞¤繘琛屼氦浜掋?br />銆銆涓涓幇浠g殑錛即錛棘娓叉煋寮曟搸鍙槸娣峰悎寮鍙戠殑涓鍗婏紝鍙︿竴鍗婂氨鏄湰鍦板簲鐢ㄥ拰娓叉煋瀵硅薄鐨勪氦浜掋傦急錛寸殑Webkit 闆嗘垚鎻愪緵浜?jiǎn)杩櫩U嶈В鍐蟲(chóng)柟妗堬細(xì)
銆銆錛?浣跨敤object鏍囩宓屽叆Qt Widgets緇勪歡銆傝繖鍙互璁╀嬌鐢跡++浠g爜鐨凲t緇勪歡鍖呭惈鍦ㄧ綉欏典腑錛屼綔涓虹綉欏電殑閮ㄥ垎澶栬銆?br />銆銆錛?鍦↗avaScript涓闂跡++瀵硅薄銆備綘鍙互鍦↗avaScript鐜涓彃鍏ワ跡++瀵硅薄錛岃緗戦〉鑴氭湰鐩存帴璁塊棶浣犵殑鏁版嵁緇撴瀯銆?br />銆銆錛?鍦≦t涓墽琛孞avaScript銆備綘鍙互鍦跡++璋冪敤緗戦〉鐜涓殑JavaScript鍑芥暟錛岃Е鍙戠綉欏典簨浠躲?br />銆銆錛?鍏變韓瀹㈡埛绔瓨鍌ㄣ傚湪JavaScript鍜岋跡++涓綘閮藉叿鏈夎闂暟鎹簱鐨勮兘鍔涳紝榪欐牱褰撲笅綰挎椂涔熻兘鍏變韓澶ч噺鏁版嵁銆?br />
(浜岋級(jí)涓庡祵鍏ョ殑Qt瀵硅薄浜や簰
銆銆浣跨敤 QWebView 緇勪歡錛屾湁涓ょ鏂規(guī)硶鍙互鍦ㄧ綉欏典腑宓屽叆C++瀵硅薄銆備綘鍙互鍦ㄧ綉欏電殑JavaScript涓坊鍔燙++瀵硅薄錛屾垨鑰呬篃鍙互鍒涘緩涓涓彃浠訛紝鐒跺悗鍦ㄧ綉欏典腑浣跨敤object鏍囩宓屽叆銆?br />銆銆
銆銆絎簩縐嶆柟娉曟洿瀹規(guī)槗鍏ユ墜銆傚綋鍦ㄧ綉欏典腑鏀懼叆 Widget緇勪歡鏃訛紝瀹冪殑鎵鏈塸ublic slots灝卞儚鏅氬嚱鏁頒竴鏍瘋緗戦〉涓殑JavaScript鍑芥暟璁塊棶銆?br /> 瑕佸湪緗戦〉涓坊鍔犱竴涓猈idget錛岄鍏堣鍛婅瘔浣犵殑QWebPage瀵硅薄,璇idget鍙敤,榪欎釜閫氳繃瀛愮被鍖朡WebPlugFactory瀹屾垚,浣犻渶瑕侀噸鏂板疄鐜頒袱涓柟娉曪細(xì)plugs鍜宑reate銆俻lugs鏂規(guī)硶閫氱煡緗戦〉璇idget鍙敤錛宑reate鏂規(guī)硶鏍規(guī)嵁璇鋒眰鍒涘緩widget銆?br />銆銆鍦℉TML緗戦〉涓紝widgets浣跨敤object鏍囩鍒涘緩銆傛瘮濡傦紝涓嬮潰榪欎釜鏍囩璇曞浘鍒涘緩涓涓?application/x-qt-colorlabel銆緇勪歡銆?/span>
<object type="application/x-qt-colorlabel" width="50px" height="20px" id="label" />
銆銆瑕佸埄鐢ㄨ繖縐嶅垱寤猴紝蹇呴』瑕佸厑璁鎬嬌鐢ㄦ彃浠跺茍涓旇鍛婅瘔QWebpage鎻掍歡鐨勫伐鍘傜被銆傚湪涓嬮潰鐨勪唬鐮佷腑錛孋olorLabelFactory灝嗕細(xì)鏍規(guī)嵁a(chǎn)pplication/x-qt-colorlabel鐨勮姹傚垱寤虹浉搴斿疄渚嬨?/p>
銆銆ColorLabel鏈変竴涓叕寮鐨剆lot: chagneColor(),榪欎釜瀵逛簬緗戦〉涓殑JavaScript鑷姩鍙敤銆傚湪緗戦〉涓彃鍏ヤ竴涓寚鍚戣鍏冪礌鐨勯摼鎺ワ紝鍙互浠ヤ竴縐嶇畝鍗曠殑鏂瑰紡嬋媧籆++鍑芥暟銆?/p>
銆
銆
銆銆瑕佸弽鏂瑰悜鎺ㄨ繘浜嬩歡錛屽繀欏昏浣夸綘鐨勫璞″湪JavaScript鏂囨。涓婁笅鏂囦腑鍙敤銆傝瀵筈WebPage鐨勬瘡涓涓猀WebFrame錛岃皟鐢╝ddToJavaScriptWindowObject鏂規(guī)硶銆傝繖涓柟娉曞厑璁鎬綘鏍規(guī)嵁鍚嶅瓧鎶婁竴涓璞℃坊鍔犲埌JavaScipt涓婁笅鏂囦腑銆?/p>
銆銆瑕佽繛鎺ュ垰娣誨姞瀵硅薄eventSource鐨勪俊鍙鳳紝瑕佸姞涓婁竴孌礘avaScript浠g爜錛屼嬌鐢╡valuateJavaScript鏂規(guī)硶瀹屾垚銆備笅闈㈢殑浠g爜灝嗘妸eventSource瀵硅薄鐨剆ignalName淇″彿榪炴帴鍒頒竴涓狫avaScript鍑芥暟destFunction銆?/p>
銆銆濡傛灉浣犳妸涓涓璞℃坊鍔犲埌涓涓互鏍囧噯嫻忚鍣ㄦ煡鐪嬬殑JavaScript欏甸潰涓紝鏈変竴涓俊鍙烽渶瑕佺煡閬撱傛瘡涓嬈avaScript 鍐呭琚竻闄わ紝Frame閮戒細(xì)閲婃斁 javaScriptWindowObjectCleared 淇″彿銆備負(fù)浜?jiǎn)鋴射綘鐨凲t瀵硅薄涓鐩村彲鐢紝浣犻渶瑕佽繛鎺ヨ繖涓俊鍙鳳紝騫朵笖鍦ㄨ繖閲岃皟鐢?addToJavaScriptWindowObject鍑芥暟銆?/p>
錛堜簩錛変嬌鐢ㄥ鎴風(fēng)瀛樺偍鍏變韓鏁版嵁
闅忕潃HTML5錛學(xué)EB鏍囧噯鏃ョ泭闈犺繎浜庢闈紝鍚屾牱錛屾闈篃寮濮嬮泦鎴怶EB銆傝繖鏂歸潰涓涓渶澶х殑鍙樺寲灝辨槸瀹㈡埛绔瓨鍌ㄣ傝繖鍦ㄥ鎴鋒満涓婄粰浜?jiǎn)姣忎竴鏂癸紙姣斿姣忎竴涓〉闈級(jí)涓涓兘鍒╃敤SQL鐨勬暟鎹簱寮曟搸錛屽彲浠ョ紦瀛樻湰鍦版暟鎹紝鍑忓皯嫻侀噺錛屼嬌欏甸潰鑳借劚鏈轟嬌鐢ㄣ傝繕鍙互鐢ㄦ潵瀛樺偍澶ч噺鐨勭粨鏋勫寲鐨勶紝鍙悳绱㈢殑鏁版嵁銆?/p>
瀹㈡埛绔瓨鍌ㄥ彲浠ュ湪JavaScript涓嬌鐢紝浠嶫avaScript浠g爜涓悳绱㈡暟鎹簱錛岀劧鍚庝粠鎼滅儲(chǔ)緇撴灉涓敓鎴愰〉闈€傝繖瑕佷嬌鐢?openDatabase鍜宼ransaction鍑芥暟銆?/p>
鍋囪鐜板湪鏈変釜鏁版嵁搴? 浠g爜濡備笅鎵紺猴細(xì)
浣跨敤QtWebkit錛屼綘鍙互浣跨敤QtSql妯″潡璁塊棶鍚屼竴涓暟鎹簱銆傝繖鍦ㄦ販鍚堝紑鍙戜腑鏄竴涓潪甯告湁鐢ㄧ殑鐗瑰緛銆傛瘮濡傦紝浣犵殑搴旂敤涓殑web欏甸潰鍦ㄥ拰鏈湴閮ㄥ垎鍏變韓鏁版嵁鏃訛紝鍙互鐢ㄥ悓鏍風(fēng)殑鏈哄埗鏉ヤ繚瀛樻暟鎹?br /> 涓轟簡(jiǎn)閬垮厤瀹夊叏闂錛屽鎴風(fēng)鐨勬暟鎹簱鍙兘鐢卞叿鏈夋紜潈闄愮殑涓鏂瑰湪JavaScript涓闂傛湰鍦扮殑C++浠g爜涔熷彲浠ラ氳繃闈?rùn)鎬佺殑QWebSecurityOrigin::allOrigins 鏂規(guī)硶錛屾垨鑰呴氳繃QWebFrame::securityOrigin 鏉ヨ闂墍鏈夊畨鍏ㄥ璞?/font>銆?br />
閫氳繃databases鏂規(guī)硶錛屽彲浠ヨ闂竴涓猀WebDatabaew鏂規(guī)硶鍒楄〃錛屾瘡涓涓獁eb鏁版嵁搴撳璞℃湁涓涓猣ilename灞炴э紝鍙互鐢ㄦ潵鍦ㄦ湰鍦頒唬鐮佷腑璁塊棶鏁版嵁搴撱?/p>
鍦╓EB鍜屾湰鍦板簲鐢ㄨ繛鎺ヤ簨浠剁殑鑳藉姏錛屽啀鍔犱笂鍏變韓鏁版嵁鐨勬満鍒訛紝鏇存槗浜庢ā緋奧EB鍜屾闈箣闂寸殑鐣岄檺銆?/p>
錛堜笁錛塛EB杞崲
寰堝閫氳繃WEB寰楀埌鐨勬暟鎹茍涓嶉傚悎鐩存帴鏄劇ず銆傛瘮濡傜綉緇滄柊闂? 鍦扮悊鏁版嵁錛屼互鍙?qiáng)鍏跺畠鐗瑰畾鏁版嵁鏍煎紡鐨勫簲鐢ㄣ俀T鐨勭綉緇滄ā鍧楀彲浠ヤ互涓縐嶅緢綆鍗曠殑鏂瑰紡涓嬭澆榪欐牱鐨勬暟鎹紝鐒跺悗瑙f瀽鏁版嵁錛屾妸瀹冭漿鎹㈡垚鑳借鑷繁鐨勪唬鐮佸鐞嗙殑鍚堥傜殑鏍煎紡銆備篃鍙互閫氳繃QtXmlPatterns妯″潡澶勭悊錛屽綋杈撳嚭鏍煎紡鏄疿ML鎴栬呮兂鍦╔HMTL緗戦〉涓樉紺烘椂錛岃繖鏍鋒洿鍔犳柟渚褲?/p>
鎴戜滑閫氳繃涓涓皬渚嬪瓙鏉ュぇ鑷翠簡(jiǎn)瑙d竴涓嬭繖涓湁鎰忔濈殑閮ㄥ垎銆傛垜浠笅杞戒竴涓柊闂繪簮錛岀敤XSLT鎶婂畠浠嶺ML杞崲鎴怷HTML錛岀劧鍚庨氳繃QWebPage鎶婂畠鏄劇ず鍑烘潵銆傦紙鍥劇暐錛?br /> QNetworkAccessManager 綾昏浣犲緢瀹規(guī)槗澶勭悊瀹㈡埛绔拰W(xué)EB鏈嶅姟鍣ㄤ箣闂寸殑浜や簰銆傚畠甯綘澶勭悊璇稿浠g悊錛屼繚瀛樿緗紝COOKIE浠ュ強(qiáng)SSL浼?xì)璇潣q欎簺緇嗚妭銆傛諱箣錛屽畠涓嶄絾璁╀綘鍦ㄨ薄涓婁紶涓嬭澆榪欎簺甯歌鎯呭喌鏇村姞瀹規(guī)槗錛岃繕鍙互甯綘澶勭悊鐧誨綍錛岃璇佽繖浜涘鏉備細(xì)璇濄?br /> 涓轟簡(jiǎn)涓嬭澆鎴戜滑渚嬪瓙涓殑鏂伴椈婧愶紝鎴戜滑鎵鏈夎鍋氱殑灝辨槸鍒涘緩涓涓?span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 16px Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; font-size-adjust: none; font-stretch: normal" class="Apple-style-span">QNetworkAccessManager 鐒跺悗璋冪敤瀹冪殑get鏂規(guī)硶銆傜粨鏋滈氳繃 finished(QNetworkReply*) 淇″彿榪斿洖銆?br />
{
QNetworkAccessManager *manager = new QNetworkAccessManager( this );
connect( manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleReply(QNetworkReply*)) );
connect( manager, SIGNAL(finished(QNetworkReply*)), m_progressBar, SLOT(hide()) );
QNetworkReply *reply = manager->get( QNetworkRequest( QUrl( feedUrl ) ) );
connect( reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateProgress(qint64,qint64)) );
}