导语

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模块。QWebViewQtWebKit模块主要的窗体部件,它可以在各种应用程序中用来显示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,类名和基类保持MainWindowQMainWindow不变。完成后向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文件中,在构造函数中添加如下代码:

progress = 0;
view = new QWebView(this);
setCentralWidget(view);
resize(800, 600);// 关联信号和槽
connect(view, SIGNAL(loadProgress(int)), this, SLOT(setProgress(int)));
connect(view, SIGNAL(titleChanged(QString)), this, SLOT(adjustTitle()));
connect(view, SIGNAL(loadFinished(bool)), this, SLOT(finishLoading(bool)));
locationEdit = new QLineEdit(this);
connect(locationEdit, SIGNAL(returnPressed()), this, SLOT(changeLocation()));// 向工具栏添加动作和部件
ui->mainToolBar->addAction(view->pageAction(QWebPage::Back));
ui->mainToolBar->addAction(view->pageAction(QWebPage::Forward));
ui->mainToolBar->addAction(view->pageAction(QWebPage::Reload));
ui->mainToolBar->addAction(view->pageAction(QWebPage::Stop));
ui->mainToolBar->addWidget(locationEdit);// 设置并加载初始网页地址
locationEdit->setText("http://www.baidu.com");
view->load(QUrl("http://www.baidu.com"));

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文档来进一步的学习。

第40篇 网络(十)WebKit初识相关推荐

  1. [Qt教程] 第40篇 网络(十)WebKit初识

    [Qt教程] 第40篇 网络(十)WebKit初识 楼主  发表于 2013-9-11 17:26:05 | 查看: 521| 回复: 10 WebKit初识 版权声明 该文章原创于作者yafeili ...

  2. 服务器存储满了进不去系统,解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖!...

    解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖! 2021-07-19 16:40:32 47点赞 302收藏 15评论 创作立场声明:本文属于原创文章,无任何利益关系, ...

  3. 2021 年不可错过的 40 篇 AI 论文,你都读过吗?

    来源:机器之心 编辑:蛋酱 虽然世界仍在从新冠疫情的破坏中复苏,人们无法向从前那样时常线下相聚.共同探讨交流关于学术领域的最新问题,但AI研究也没有停下跃进的步伐. 转眼就是2021年底了,一年就这么 ...

  4. 自学c语言后的感受,C语言感触篇:十年之后重学C语言,岁月蹉跎,我听闻你始终一个人...

    C语言感触篇:十年之后重学C语言,岁月蹉跎,我听闻你始终一个人 我只是C粉 1.1 多次自学,不得其法 距离大学时学习C语言已有十个年头了.印象里最深的就是当时一位海归老师,在讲课时流露出对K& ...

  5. [Qt教程] 第32篇 网络(二)HTTP

    [Qt教程] 第32篇 网络(二)HTTP 楼主  发表于 2013-8-28 17:21:28 | 查看: 637| 回复: 8 HTTP 版权声明 该文章原创于作者yafeilinux,转载请注明 ...

  6. 计算机网络教程网线制作,图吧小白教程 篇二十六:手把手教你自制网线(夹网线水晶头)...

    图吧小白教程 篇二十六:手把手教你自制网线(夹网线水晶头) 2019-11-19 23:07:38 31点赞 309收藏 27评论 创作立场声明:咕咕咕 教程最后还是出了,不过咱现在用啥还是直接网购号 ...

  7. 科学计算机后盖换电池,图吧小白教程 篇二十二:手把手教你给手机换电池(拆机)...

    图吧小白教程 篇二十二:手把手教你给手机换电池(拆机) 2019-11-16 14:06:58 4点赞 18收藏 2评论 创作立场声明:手机换电池省钱可以自己动手从工钱上省,买电池最好还是不要省钱买杂 ...

  8. 关闭数字健康 android 魅族,数字体验 篇二十八:精雕细刻,只为给魅友更好的选择,魅族16s Pro体验分享...

    数字体验 篇二十八:精雕细刻,只为给魅友更好的选择,魅族16s Pro体验分享 2019-09-06 17:31:22 14点赞 10收藏 15评论 当我还一直在称赞魅族16s所拥有的舒适手感表现时, ...

  9. 一篇网络创始人赵宏民出任耳朵财经合伙人 负责全国节点建设

    5月28日消息,耳朵财经宣布一篇网络创始人.速途网络上海办总经理赵宏民已于近日加入区块链垂直媒体耳朵财经,担任全国合伙人一职,主要负责耳朵财经全国各地节点的建设,统筹各地运营及管理等工作. 赵宏民,一 ...

最新文章

  1. 又一位!26岁当上985博导,读博期间也曾两次想要退学......
  2. Socket 通信原理(Android客户端和服务器以TCPUDP方式互通)
  3. 嵌入式C语言代码的调试技巧
  4. Rolling Guidance Filter
  5. SAP读取财务报表版本的标准函数
  6. win10安装linux分配两个磁盘,Win10 与 Ubuntu 16.04 LTS 双硬盘双系统安装及环境配置...
  7. OpenGL camera相机的实例
  8. websocket的压力测试和异步并发啥关系?
  9. spring aop 会根据实际情况(有无接口)自动选择 两种 动态代理(jdk和cglib)之一...
  10. C语言-ATT拓展内联汇编(ATT/GCC)
  11. Spring整合Struts2的两种方式
  12. html清除两端浮动,HTML中如何实现浮动与清除浮动
  13. navicat premium for Mac 云盘分享破解版
  14. 运维学python用不上_数读 | 为什么运维朋友们都需要学Python?
  15. SLAM十四讲第三章课后习题
  16. Hbuild - 使用海马玩模拟器调试
  17. 【单片机仿真项目】数码管(proteus原理图+keil代码)
  18. 市北·GMIS 2019 全球数据智能峰会全记录
  19. 谷歌X最新开源任务驱动的类级别机器人抓取CaTGrasp!
  20. python图片处理(PIL)

热门文章

  1. win2012server .NET Runtime Optimization Service CPU占用高的
  2. IOS常用的文件管理
  3. 常用js正则表达式 Javascript正则表达式实战手册
  4. Android时光轴
  5. 小米春季新品发布会直播地址 小米发布会在线观看入口
  6. 中国云计算发展四大趋势预测
  7. Sql中日期类型的比较
  8. 影评人进阶工具:幕布、为知笔记、 Effie 哪个更适合创作?
  9. iOS开发,利用PanoramaGL生成360度全景预览图,附选择本地全景图片并生成全景预览...
  10. Mysql数据库---学习总结(二) 之使用练习