Qt WebKit可以做什么

news/2024/5/18 22:29:09 标签: webkit, qt, javascript, object, signal, web开发
Qt WebKit可以做什么
2010-07-13 23:14

 

欢迎看看我的另一个小窝,可能会有意外的惊喜哦^_^ www.devres.info

From:http://software.intel.com/zh-cn/blogs/2010/06/08/qt-webkit-qt-webkit/

Author:Dawei Cheng程大伟(Intel)
这个命题不太好回答,因为Qt的库一直在更新,KDE中webkit的项目也在有新版本release出来。就据我了解的和大家分享一下,互通有无。
要看Qtwebkit能干嘛,那就先了解一下历史了(Joewan注:我做什么事情,也喜欢首先了解它的历史),WebKit 是一个开源的浏览器引擎,与之相应的引擎有Gecko(Mozilla Firefox等使用的排版引擎)和Trident(也称为MSHTML,IE使用的排版引擎)。同时WebKit也是苹果Mac OS X系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X程序。WebKit所包含的WebCore排版引擎和JSCore引擎来自于KDE的 KHTML和 KJS,当年苹果比较了Gecko和KHTML后,仍然选择了后者,就因为它拥有清晰的源码结构、极快的渲染速度。
以上这段摘自百科,目前Webkit项目由http://webkit.org/组织开发。详情浏览网站吧!看一下下图webkit架构:
webkit" src="http://hiphotos.baidu.com/mikenoodle/pic/item/6455d307d1cbe88d7b894794.jpg" alt="Qt <wbr>WebKit可以做什么(一)——认识Qt <wbr>webkit" />
QtWebkit就是webkit porting到Qt的平台上。看一下Qt Webkit的架构先:
webkit" src="http://hiphotos.baidu.com/mikenoodle/pic/item/88f79951e782016442a75b94.jpg" alt="Qt <wbr>WebKit可以做什么(一)——认识Qt <wbr>webkit" />
这两张图可以看出Qt webkitwebkit 的区别:
1、Text Handling、Painting、Networking采用的Qt的内核
2、更加容易使用Qt的API
那么Qt的集成webkit能够带来哪些优势呢:
1、快速创建包含实时网络内容和服务的应用程序
2、在一个应用程序中集成网络和本地内容
3、可以在不同平台上运行开发的web应用。
那么下面看看web开发的应用程序是什么样的架构,以及如何去开发。
webkit" src="http://hiphotos.baidu.com/mikenoodle/pic/item/b1d9de3324a4df03ad4b5f94.jpg" alt="Qt <wbr>WebKit可以做什么(一)——认识Qt <wbr>webkit" />
在下面三层使用的是C++的code去开发,在application层,Qt就可以支持最常用的网页设计三剑客(HTML,CSS,Javascript)去开发,这样将可以使数量众多的网页开发人员开发Qt应用成为可能。

OK,开篇先写到此,下面几节当中将详细介绍如何使用网页设计三剑客去开发Qt应用程序

From:http://software.intel.com/zh-cn/blogs/2010/06/08/qt-webkitamp/

Author:Dawei Cheng程大伟(Intel)
在第二篇我们实现一个非常简单的例子。使用Qt WebKit显示网页。
注:这个demo网上有很多,包括nokia Qt 的doc 和example官方文档里也有相关例子。但是有不全面的地方,在编译运行时甚至会显示不出网页,这是因为几个小地方没有注意到,可能有的博主自己并没有实际去编译。鉴于这个demo很简单,就全部源代码贴上。
1.新建main.cpp
#include <QtGui>
#include <QtWebKit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//设置网络代理:使用系统代理
QNetworkProxyFactory::setUseSystemConfiguration(true);
//显示网页
QWebView view;
view.load(QUrl("http://qt.nokia.com"));
view.show();
return a.exec();
}
2.新建 web.pro 文件
显示网页只需要区区这几行源代码即可,但是在.pro文件中,需要做如下更改
//此处不仅需要webkit模块,还需要network模块。因为Webkit依赖于network
QT += webkit/network
HEADERS =
SOURCES = main.cpp
RESOURCES =
3.编译运行
$qmake -project | $qmake | $make | $./web
运行结果如下:
Qt <wbr>WebKit可以做什么(二)——显示网页&获取网络服务
要提高响应时间,我们可以增加缓存系统。QDesktopServices::storageLocation中的CacheLocation枚举函数可处理在跨平台情况下,指定存储位置的情况。使用QabstractNetworkCache接口,可以自己实现并使用定制的缓存系统。
以下四行代码就可增加本地缓存来提高响应时间:
QNetworkDiskCache *diskCache = new QNetworkDiskCache(this);
QString location =QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
diskCache->setCacheDirectory(location);
networkAccessManager->setCache(diskCache);
部分网站提供的不仅有内容,还有多种服务。网络服务的内容从货币汇率信息到企业应用程序接入外部网络的连接,多种多样。借助Qt WebKit集成,可在应用程序中使用这些网络服务。例如Twitter认证请求的代码:
QNetworkRequest request(“http://twitter.com”);
req.setRawHeader("Authorization", basicBase64);
QNetworkReply *reply = manager->get(request);
Qt webkit中如何显示网页和使用网络服务介绍到此。

第三篇将介绍在Qt webkit中如何去使用web扩展功能,即HTML/CSS/JS工具去设计application。

From:http://software.intel.com/zh-cn/blogs/2010/06/09/qt-webkitweb/

Author:Dawei Cheng程大伟(Intel)
这一篇我们来看看如何在Qt WebKit 中使用web开发工具去开发包含web内容的本地应用程序。
注:本系列文章重在分享一下开发过程,至于webkit如何去解释HTML的DOM tree以及如何去rendering HTML 和JavaScript可以参考http://webkit.org/。
在分享开发过程之前,首先还是看一下这个web应用的架构:
Qt <wbr>WebKit可以做什么(三)——包含web内容的本地应用
1. 开发环境:
(1)Based on QtWebKit browser engine
(2)Developed with HTML, CSS and JavaScript
(3)Used by Qt Creator for Windows
other IDEs, such as Visual Studio or Eclipse, as well.
2. 新建项目:
(1)Start the Qt Creator IDE.
(2)Select File > New File or Project... > Projects > Qt4 Gui Application.
(3)Give the project a name and set its location.
(4)Check the QtWebKit module and click Next, and then click Finish.
3. 修改代码:此时在creator左边edit栏目里会看到project的源代码。打开头文件widgetwindow.h,做如下修改:
#ifndef WIDGETWINDOW_H
#define WIDGETWINDOW_H
#include <QtCore/QPointer>
#include <QtGui/QMainWindow>
class QWebView;
class WidgetWindow : public QMainWindow
{
Q_OBJECT
public:
WidgetWindow(QWidget *parent = 0);
~WidgetWindow();
private:
void setupUI();
//声明用来显示web应用的函数
QWebView* createWebView();
private:
QPointer<QWebView> webView;
};
#endif // WIDGETWINDOW_H
4. 显示web内容
在Qt project中创建web应用所需要的HTML, CSS和JavaScript文件,且假设其分别在html/, style/, 和 script/文件夹里。文件夹视图如下:如果想了解更多关于web开发,请点此进入: http://zh.html.net/tutorials/html/
html/ (HTML files) style/ (CSS files) script/ (JavaScript files)
Create the resource file。 Qt中是通过qrc文件来实现对web内容文件的链接的。以下是qrc文件 helloqtwebkit.qrc的内容:
<?xml version="1.0" encoding="utf-8"?>
<RCC version="1.0">
<qresource>
<!-- HTML files -->
<file>html/index.html</file>
<!-- CSS files -->
<file>style/general.css</file>
<!-- JavaScript files -->
<file>script/basic.js</file>
</RCC>
打开HTML文件,将HTML文件代码粘贴如下:这是一个很简单的helloDemo。
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="StyleSheet" href="qrc:/style/general.css" type="text/css" />
<script type="text/javascript" src="qrc:/script/basic.js" charset="utf-8"></script>
<title>Hello Qt WebKit</title>
</head>
<body onLoad="javascript:init();">
<input type=submit value="Hello Qt WebKit! "
<div id="output">
</div>
</body>
5. 函数实现。 打开函数文件 widgetwindow.cpp,实现之前声明的createwebview函数。
QWebView* WidgetWindow::createWebView()
{
QWebView* view = new QWebView(this);
view->load(QUrl("qrc:/html/index.html"));
return view;
}
6. 至此,工作全部完成。build the application,将会出现期待已久的JavaScript的hello按钮:
Qt <wbr>WebKit可以做什么(三)——包含web内容的本地应用
这一篇主要讲解了如何使用HTML,CSS和JavaScript在Qt webkit引擎上开发web应用。
本篇的源代码可以在此下载: http://software.intel.com/file/28104

下一篇我们将了解如何将Qt本地的Object 和JavaScript进行交互。这对web开发非常有用

上一篇我们了解了如何在webkit中创建含有web内容的本地应用。这一篇我们将实现JavaScript和本地的QObject的交互。在阅读本篇之前需要对Qt的信号和槽机制和JavaScript有简单的了解。
Qt本地对象和JavaScript交互分为三个步骤:
(1)将本地QObject暴露给webkit和JavaScript
(2)将本地QObject的信号和JavaScript的槽连接起来
(3)通过JavaScript调用本地QObject的槽
Qt <wbr>webKit可以做什么(四)——本地QObject和JavaScript
第1步和第2步结合起来实现本地QObject的信号和JavaScript的槽连接
第1步和第3步结合起来实现 通过JavaScript调用本地QObject的槽
下面我们就分别看一下第1、2、3步分别如何实现的。
1、将本地QObject暴露给Webkit。主要分为以下几个步骤。
(1)新建一个QObject,命名为simpleQObject,包含信号和槽。其头文件如下:
#include <QtCore/QObject>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QVariant>
class SampleQObject : public QObject
{
Q_OBJECT
public:
SampleQObject(QObject *parent = 0);
signals:
void signal(QMap<QString, QVariant> object);
public slots:
//QObject 的槽,用来返回字符串
QMap<QString, QVariant> slotThatReturns(const QMap<QString, QVariant>& object);
void slotThatEmitsSignal(); //QObject的槽,用来发射信号,并且记录发射次数
private:
int m_signalEmited;
QMap<QString, QVariant> m_returnObject;
QMap<QString, QVariant> m_emitSignal;
};
(2)创建实现函数。mainwindow.h 和 mainwindow.cpp。 mainwindow.h代码如下
#include <QMainWindow>
#include "sampleqobject.h“
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void addJavaScriptObject();
protected:
void changeEvent(QEvent *e);
private:
Ui::MainWindow *ui;
SampleQObject* m_sampleQObject;
};
(3)mainwindow.cpp关键代码如下:
//当网页被载入或者刷新时,将暴露给webkit的QObject和webkit JavaScript连接
connect(ui->webView->page()->mainFrame(),
SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(addJavaScriptObject()));
void MainWindow::addJavaScriptObject()
{
//addJavaScriptObject函数的实现:将simpleQObject和webkit JavaScript连接
this->ui->webView->page()->mainFrame()->addToJavaScriptWindowObject
("sampleQObject“, this->m_sampleQObject);
}
2. 将本地QObject的信号和JavaScript的槽连接起来:
Qt <wbr>webKit可以做什么(四)——本地QObject和JavaScript
(1)如何发射QObject信号。
signals:
void signal(QMap<QString, QVariant> object);
public slots:
void slotThatEmitsSignal();
void SampleQObject::slotThatEmitsSignal()
{
qDebug() << "SampleQObject::slotThatEmitsSignal";
this->m_signalEmited++;
this->m_emitSignal.clear();
this->m_emitSignal["signalsEmited"] = QVariant(this->m_signalEmited);
this->m_emitSignal["sender"] = QVariant("SampleQObject::slotThatEmitsSignal");
qDebug() << "SampleQObject::slotThatEmitsSignal" << this->m_emitSignal;
emit signal(this->m_emitSignal);
}
(2)JavaScript槽的实现
$(document).ready(function() {
try {
sampleQObject.signal.connect(slot);
sampleQObject.slotThatEmitsSignal();
}
catch(e) {
alert(e);
}
});
function slot(object) {
var objectString = object.sender +
" has emited signal " +
object.signalsEmited +
" times.";
alert(objectString);
}
(3)Run the app。
Qt <wbr>webKit可以做什么(四)——本地QObject和JavaScript
当点击刷新时,弹出新的对话框:
Qt <wbr>webKit可以做什么(四)——本地QObject和JavaScript
3. 通过JavaScript调用本地QObject的槽
Qt <wbr>webKit可以做什么(四)——本地QObject和JavaScript
(1)JavaScript信号发射
try {
var object = {intValue: 1};
var returnedObject = sampleQObject.slotThatReturns(object);
alert(returnedObject.stringValue);
}
(2)QObject 槽函数
QMap<QString, QVariant> SampleQObject::slotThatReturns(const QMap<QString, QVariant>& object)
{
qDebug() << "SampleQObject::slotThatReturns";
this->m_returnObject.clear();
this->m_returnObject.unite(object);
QString addedBonus = QString::number(object["intValue"].toInt(),10).append(" added bonus.");
this->m_returnObject["stringValue"] = QVariant(addedBonus);
qDebug() << "SampleQObject::slotThatReturns" << this->m_returnObject;
return this->m_returnObject; // 返回m_returnObject包含有字符串 1 added bonus
}
(3)Run the app
Qt <wbr>webKit可以做什么(四)——本地QObject和JavaScript
本例子代码下载地址: http://software.intel.com/file/28111 http://software.intel.com/file/28112
注:本例子中部分代码来自 wiki.forum.nokia.com
下一篇我们将探索一下如何将S60下的web runtime widget porting至Qt的webkit上来,如今的WRT widget只能依赖于S60的os,如果

http://www.niftyadmin.cn/n/1748378.html

相关文章

BZOJ 1531 二进制优化多重背包

思路&#xff1a; 讲道理我应该写单调队列优化多重背包的 但是我不会啊 但是我现在&#xff01; 还不会啊 我就写了个二进制优化的.. 过了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,cpy[222],…

Haiwei ET128 Linux

Haiwei ET128 Linux2009年09月01日 星期二 18:09everest0.6 安装 HuaWei ET128 3G上网卡 前天去移动办了个随e行G3上网卡&#xff0c;回来一看&#xff0c;只有windows驱动和软件&#xff0c;但我平时多数时间在linux下&#xff0c;用google扒啦了一下&#xff0c;还真有配置方…

201521123087 《Java程序设计》第3周学习总结

1、本周学习总结 2. 书面作业 代码阅读 public class Test1 {private int i 1;//这行不能修改 private static int j 2; public static void main(String[] args) { geti(); Test1getj(); } public static void geti() { System.out.println(i); } public static void getj()…

htmp to pdf

C Library to Convert HTML to PDF html2pdfPrinceXML 收费CutePDFGhostscriptPDFDocVisPDFPDFDoc Scoutwkhtml2pdf 最完善方案&#xff0c;缺点&#xff1a;EXE&DLL文件太大githubPDF to HTML pdf2htmlEX githubPDF 操作SDK ByteScout – create PDF, extract text from P…

php composer.phar install 报错

在使用php composer.phar install 时报的错误mongodb/mongodb 1.0.0 requires ext-mongodb ^1.1.0 -> the requested PHP extension mongodb is missing from your system.这个问题的大致意思是mongodb1.00需要扩展驱动mongo 1.10,问题原因可能是:mongodb和mongodb的驱动扩展…

华为ET128 中兴ZTE MU351移动TD-SCDMA G3上网卡

#1 华为ET128 &中兴ZTE MU351移动TD-SCDMA G3上网卡在everest0.6配置成功 yippee 2009/7/20 13:41 前天去移动办了个随e行G3上网卡&#xff0c;回来一看&#xff0c;只有windows驱动和软件&#xff0c;但我平时多数时间在linux下&#xff0c;用google扒啦了一下&#xff0c…

关于在链路聚合下做smart,monitor link的转发测试

关于在链路聚合下做smart&#xff0c;monitor link的转发测试这次又要开始瞎折腾了。没事找事了。毕竟我还是很无聊的&#xff1b;这个实验主要要涉及到以下几个方面&#xff1a;1、gvrp的应用&#xff1a;2、Smart Link与Monitor Link的配置&#xff1b;3、链路聚合&#xff1…

嵌入式Linux下3G模块的驱动和应用

嵌入式Linux下3G模块的驱动和应用 技术 2010-09-25 13:25:13 阅读108 评论0 字号&#xff1a;大中小 订阅 嵌入式Linux下3G模块的驱动和应用 1、 开发资源 1.1、硬件资源&#xff1a; ZTE-mf637u&#xff08;中国联通&#xff09; ZTE-mu351&#xff08;中国移…