随笔-3  评论-13  文章-10  trackbacks-0
在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(00600400);
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(00600400);
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(00600400);
 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++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理