[Qt教程] 第40篇 网络(十)WebKit初识
[Qt教程] 第40篇 网络(十)WebKit初识
WebKit初识
版权声明
该文章原创于作者yafeilinux,转载请注明出处!
导语
WebKit是一个开源的浏览器引擎。Qt中提供了基于WebKit的QtWebKit模块,它包含了一组相关的类。QtWebKit提供了一个Web浏览器引擎,使用它便可以很容易的将万维网(WorldWide Web)中的内容嵌入到Qt应用程序中。与此同时,本地也可以对Web内容进行控制。QtWebKit可以呈现HTML(HyperTextMarkup Language,超文本标记语言)文档、XHTML(Extensible HyperTextMarkup Language,可扩展超文本标记语言)文档和SVG(Scalable VectorGraphics,可缩放矢量图形)文档,风格使用CSS(Cascading StyleSheets,层叠样式表),脚本使用JavaScript。在JavaScript执行环境和Qt对象模型间搭建的桥梁,实现了使用WebKit的JavaScript环境访问本地对象。关于这一点,大家可以在帮助中参考The QtWebKit Bridge关键字对应的文档。通过整合Qt的网络模块,实现了从Web服务器、本地文件系统甚至Qt资源系统中透明的加载Web页面。
环境:Windows Xp + Qt 4.8.5+Qt Creator2.8.0
目录
一、简单应用
二、扩展应用
正文
一、简单应用
下面我们来实现一个可以打开特定网页的程序。新建空的Qt项目,在pro项目文件中添加一行代码:QT += webkit,然后向项目中添加一个main.cpp文件,并在其中添加如下代码:
#include <QWebView>
#include <QApplication>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QWebView view;
view.load(QUrl("http://www.qter.org"));
view.show();
return a.exec();
}
要使用WebKit,就要先添加webkit模块。QWebView是QtWebKit模块主要的窗体部件,它可以在各种应用程序中用来显示Internet上的网页内容。QWebView作为一个窗口部件,可以嵌入到窗体或者图形视图部件中。
QWebView用来显示Web页面,每个QWebView实例都包含一个QWebPage对象。QWebPage提供了对一个页面的文档结构的访问,描述了如框架(frame)、访问历史记录和可编辑内容的撤销/重做栈等特色。每一个QWebPage都包含一个QWebFrame对象作为它的主框架。在HTML中的每一个单独的框架都可以使用QWebFrame来表示,这个类包含了到JavaScript窗口对象的桥梁,而且可以进行绘制。在QWebPage的主框架中可以包含很多的子框架。
HTML文档中单独的元素可以通过DOM JavaScript接口进行访问,在QtWebKit中与这个接口等价的接口由QWebElement来表示。QWebElement对象可以使用QWebFrame的findAllElement()和findFirstElement()函数来获取。一般的网页浏览器的特色设置都可以通过QWebSettings类来配置,可以通过默认设置为所有的QWebPage实例提供默认值。单独的属性可以使用页面指定的设置对象进行重写。
二、扩展应用
下面再来看一个可以随意更改网址并且可以显示网站logo的例子。新建Qt Gui应用,项目名称为“webview”,类名和基类保持“MainWindow”和“QMainWindow”不变。完成后向webview.pro文件中添加QT += webkit一行代码,并按下Ctrl + S保存该文件。
1.下面到mainwindow.h文件中,先添加头文件:
#include <QWebView>
#include <QLineEdit>
然后添加槽的声明:
protected slots:
void changeLocation(); // 改变路径
void setProgress(int); // 更新进度
void adjustTitle(); // 更新标题显示
void finishLoading(bool); // 加载完成后进行处理
再添加对象和变量定义:
QWebView *view;
QLineEdit *locationEdit;
int progress;
2.下面到mainwindow.cpp文件中,在构造函数中添加如下代码:
复制代码
当QWebView开始加载时,会发射loadStarted()信号;而每当一个网页元素(例如一张图片或一个脚本等)加载完成时,都会发射loadProgress()信号;最后,当加载全部完成后,会发射loadFinished()信号,如果加载成功,该函数的参数为true,否则为false。可以使用title()来获取HTML文档的标题,如果标题发生了改变,将会发射titleChanged()信号。
3.下面添加那几个槽的定义:
void MainWindow::changeLocation()
{
QUrl url = QUrl(locationEdit->text());
view->load(url);
view->setFocus();
}
void MainWindow::setProgress(int p)
{
progress = p;
adjustTitle();
}
void MainWindow::adjustTitle()
{
if ( progress <= 0 || progress >= 100) {
setWindowTitle(view->title());
} else {
setWindowTitle(QString("%1 (%2%)").arg(view->title()).arg(progress));
}
}
void MainWindow::finishLoading(bool finished)
{
if (finished) {
progress = 100;
setWindowTitle(view->title());
} else {
setWindowTitle("web page loading error!");
}
}
下面运行程序,效果如下图所示:
结语
WebKit是一个很庞大的体系,我们这里只是讲解了其最基本的应用,有兴趣的朋友可以结合Qt文档来进一步的学习。
涉及到的代码: myweb.rar (382 Bytes, 下载次数: 3) webview.rar (2.17 KB, 下载次数: 5) |
[Qt教程] 第40篇 网络(十)WebKit初识相关推荐
- [Qt教程] 第32篇 网络(二)HTTP
[Qt教程] 第32篇 网络(二)HTTP 楼主 发表于 2013-8-28 17:21:28 | 查看: 637| 回复: 8 HTTP 版权声明 该文章原创于作者yafeilinux,转载请注明 ...
- [Qt教程] 第39篇 网络(九)进程和线程
[Qt教程] 第39篇 网络(九)进程和线程 楼主 发表于 2013-8-29 15:48:56 | 查看: 415| 回复: 0 进程和线程 版权声明 该文章原创于作者yafeilinux,转载请 ...
- [Qt教程] 第38篇 网络(八)TCP(二)
[Qt教程] 第38篇 网络(八)TCP(二) 楼主 发表于 2013-9-6 15:50:35 | 查看: 421| 回复: 3 TCP(二) 版权声明 该文章原创于作者yafeilinux,转载 ...
- [Qt教程] 第37篇 网络(七)TCP(一)
[Qt教程] 第37篇 网络(七)TCP(一) 楼主 发表于 2013-9-6 15:44:45 | 查看: 398| 回复: 1 TCP (一) 版权声明 该文章原创于作者yafeilinux,转 ...
- [Qt教程] 第36篇 网络(六)UDP
[Qt教程] 第36篇 网络(六)UDP 楼主 发表于 2013-9-5 11:38:50 | 查看: 241| 回复: 0 UDP 版权声明 该文章原创作者yafeilinux,转载请注明出处! ...
- [Qt教程] 第35篇 网络(五)获取本机网络信息
[Qt教程] 第35篇 网络(五)获取本机网络信息 楼主 发表于 2013-9-5 11:32:58 | 查看: 278| 回复: 2 获取本机网络信息 版权声明 该文章原创于作者yafeilinu ...
- [Qt教程] 第34篇 网络(四)FTP(二)
[Qt教程] 第34篇 网络(四)FTP(二) 楼主 发表于 2013-9-4 15:04:38 | 查看: 315| 回复: 9 FTP(二) 版权声明 该文章原创于作者yafeilinux,转载 ...
- [Qt教程] 第33篇 网络(三)FTP(一)
[Qt教程] 第33篇 网络(三)FTP(一) 楼主 发表于 2013-9-4 14:52:46 | 查看: 392| 回复: 8 FTP(一) 版权声明 该文章原创于作者yafeilinux,转载 ...
- [Qt教程] 第31篇 网络(一)Qt网络编程简介
[Qt教程] 第31篇 网络(一)Qt网络编程简介 楼主 发表于 2013-8-28 17:04:17 | 查看: 515| 回复: 0 Qt网络编程简介 版权声明 该文章原创于作者yafeilin ...
最新文章
- CLR 中 线程的 ThreadState 解释
- SAP ABAP ALV(LVC)的一个自定义事件(F4帮助事件,回车ENTER按钮事件)的一个实例
- 【maven插件】maven-resources-plugin
- redmine常见问题
- 单点登录的原理与CAS技术的研究
- C++ virtual 析构函数
- Python面试题大全(三):Web开发(Flask、爬虫)
- 学之思开源考试系统 - 使用手册
- linux 4 内核 c,4. 使代码正确 — The Linux Kernel documentation
- 页面404圈小猫游戏代码
- 3亿流量还能让Keep错几次?
- 13.2 RS编码和纠错算法
- CCL 2020闭幕,数万人见证2020年中国NLP全貌剪影
- vue底部跳转_Vue实现回到顶部和底部动画效果
- 关于鸿基暗影骑士笔记本键盘win键失灵的问题
- 上海市大学生CTF(华东杯CTF) Crypto 全解
- idea+SMM框架实例
- 10_SkyWalking
- 【解决方案】国标视频平台EasyGBS如何搭建应急管理与安全生产平台
- php字符串截取成数组,PHP explode():字符串转数组
热门文章
- MySQL数据库管理常用命令
- 谈谈DictionaryT1,T2和ListT的问题
- 因为WPFe JavaScript到了不得不学的地步
- 计算机应用技术滨江计划,杭州高新区(滨江)列出干货满满的“计划表”
- unet脑肿瘤分割_2D UNet3+ Pytorch实现 脑肿瘤分割
- C语言学习之有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1
- 关于ArcMap中的地图文档单位
- options模块介绍
- lis最长上升子序列o(nlogn)优化
- 算法学习--Day5