在QT里面,我们可以很方便地调用QtWebKit类库,来实现一个浏览器的开发
基于Html的界面在开发效率,可移植性上都十分有优势,所以也被很多程序采用,只是我们平时没注意到而已
下面先说一下,如何创建一个简易的浏览器
通过VS2008+QTSDK,创建一个qt4 GUI工程:
记住,一定要选上QtWebKit和QNetwork(这个后面要用到)...
写如下一段代码,一个浏览器就做成了:
main.cpp
1#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.cppblog.com/boymaster"));
12 window.show();
13 return a.exec();
14}
15 QWebView有两种方法可以用来设定要显示的内容,一个是setUrl方法,一个是setContent方法。 这个很简单,试一下就会,不多说了
进入正题了,接下来介绍一下,如何实现js与C++的双向调用
这里,仅介绍开发中用到的一种调用方式, 用QWebFrame的addToJavaScriptWindowObject方法
个人比较推荐这种方式,易为理解~~~
1. JS如何调用C++函数,详见代码~~~
myobject.h
1#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
1#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.cppblog.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 这样,当点击页面上的"Click Me",script脚本用会调用到C++中的func函数~~~
2.C++调用JS脚本
myobject.h
1class 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
1int 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.cppblog.com/boymaster'; }</SCRIPT>");
13 view.setContent(content.toAscii());
14 window.show();
15 return a.exec();
16}
17 这样,页面加载后,C++的Timer每隔1秒就会调用到JS的f()函数
posted on 2012-11-09 10:45
双鱼座的程序员 阅读(443)
评论(0) 编辑 收藏 引用 所属分类:
Qt/C++