当前位置: 首页 > 工具软件 > QtWebKit > 使用案例 >

Qt网络WebKit初识

阚亮
2023-12-01

导语

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页面。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

1、简单应用

下面我们来实现一个可以打开特定网页的程序。新建空的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实例提供默认值。单独的属性可以使用页面指定的设置对象进行重写。

2、扩展应用

下面再来看一个可以随意更改网址并且可以显示网站logo的例子。新建Qt Gui应用,项目名称为“webview”,类名和基类保持“MainWindow”和“QMainWindow”不变。完成后向webview.pro文件中添加QT += webkit一行代码,并按下Ctrl + S保存该文件。

2.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.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() 信号。

2.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!");
    }
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

 类似资料: