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

简介:
楼主
  发表于 2013-9-11 17:26:05  | 查看: 521 | 回复: 10
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 文件中,在构造函数中添加如下代码:
  1. progress = 0;
  2. view = new QWebView(this);
  3. setCentralWidget(view);
  4. resize(800, 600);

  5. // 关联信号和槽
  6. connect(view, SIGNAL(loadProgress(int)), this, SLOT(setProgress(int)));
  7. connect(view, SIGNAL(titleChanged(QString)), this, SLOT(adjustTitle()));
  8. connect(view, SIGNAL(loadFinished(bool)), this, SLOT(finishLoading(bool)));
  9. locationEdit = new QLineEdit(this);
  10. connect(locationEdit, SIGNAL(returnPressed()), this, SLOT(changeLocation()));

  11. // 向工具栏添加动作和部件
  12. ui->mainToolBar->addAction(view->pageAction(QWebPage::Back));
  13. ui->mainToolBar->addAction(view->pageAction(QWebPage::Forward));
  14. ui->mainToolBar->addAction(view->pageAction(QWebPage::Reload));
  15. ui->mainToolBar->addAction(view->pageAction(QWebPage::Stop));
  16. ui->mainToolBar->addWidget(locationEdit);

  17. // 设置并加载初始网页地址
  18. locationEdit->setText("http://www.baidu.com");
  19. 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!");
     }
}


        下面运行程序,效果如下图所示:


01.jpg




结语



WebKit 是一个很庞大的体系,我们这里只是讲解了其最基本的应用,有兴趣的朋友可以结合 Qt 文档来进一步的学习。




涉及到的代码:  myweb.rar (382 Bytes, 下载次数: 3)  webview.rar (2.17 KB, 下载次数: 5) 

相关文章
|
9月前
|
安全 网络协议 算法
Nmap网络扫描工具详细使用教程
Nmap 是一款强大的网络发现与安全审计工具,具备主机发现、端口扫描、服务识别、操作系统检测及脚本扩展等功能。它支持多种扫描技术,如 SYN 扫描、ARP 扫描和全端口扫描,并可通过内置脚本(NSE)进行漏洞检测与服务深度枚举。Nmap 还提供防火墙规避与流量伪装能力,适用于网络管理、渗透测试和安全研究。
1404 1
|
11月前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
1944 0
|
数据采集 存储 监控
Python 原生爬虫教程:网络爬虫的基本概念和认知
网络爬虫是一种自动抓取互联网信息的程序,广泛应用于搜索引擎、数据采集、新闻聚合和价格监控等领域。其工作流程包括 URL 调度、HTTP 请求、页面下载、解析、数据存储及新 URL 发现。Python 因其丰富的库(如 requests、BeautifulSoup、Scrapy)和简洁语法成为爬虫开发的首选语言。然而,在使用爬虫时需注意法律与道德问题,例如遵守 robots.txt 规则、控制请求频率以及合法使用数据,以确保爬虫技术健康有序发展。
1605 31
|
域名解析 API PHP
VM虚拟机全版本网盘+免费本地网络穿透端口映射实时同步动态家庭IP教程
本文介绍了如何通过网络穿透技术让公网直接访问家庭电脑,充分发挥本地硬件性能。相比第三方服务受限于转发带宽,此方法利用自家宽带实现更高效率。文章详细讲解了端口映射教程,包括不同网络环境(仅光猫、光猫+路由器)下的设置步骤,并提供实时同步动态IP的两种方案:自建服务器或使用三方API接口。最后附上VM虚拟机全版本下载链接,便于用户在穿透后将服务运行于虚拟环境中,提升安全性与适用性。
1115 7
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
586 20
|
前端开发 小程序 Java
uniapp-网络数据请求全教程
这篇文档介绍了如何在uni-app项目中使用第三方包发起网络请求
1092 3
|
存储 数据可视化 API
重磅干货,免费三方网络验证[用户系统+CDK]全套API接口分享教程。
本套网络验证系统提供全面的API接口,支持用户注册、登录、数据查询与修改、留言板管理等功能,适用于不想自建用户系统的APP开发者。系统还包含CDK管理功能,如生成、使用、查询和删除CDK等。支持高自定义性,包括20个自定义字段,满足不同需求。详细接口参数及示例请参考官方文档。
763 7
|
弹性计算 Kubernetes 网络协议
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程

推荐镜像

更多
  • qt