Qt文档阅读笔记-QWebView官方解析与实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/88740051

目录

 

 

背景

官方解析

博主例子


 

背景

最近发现某Qt项目,出现的效果杠杆的,在看某一小功能的时候,发现有个echart的东西,百度了发现,真的是一个新大陆,Qt加web编程,贼吉尔可怕。

在此发现使用QWebengine能做,但本人的编译器刚好是MSVC2012,貌似要2013以上的版本,才支持,在此使用老的技术,QWebView去做,目前再下一个Centos,准备安装最新版Qt,后期直接在Linux上使用QWebengine。

官方解析

QWebView提供Web浏览的功能,使用了WebKit浏览器内核(等会抓包来看看)。

如果访问Internet的web,使用load()函数或setUrl(),访问本地的html网页使用setHtml。

    QWebView *view = new QWebView(parent);
    view->load(QUrl("http://qt.nokia.com/"));
    view->show();

这里还有一系列的信号:

          1. loadStarted()信号:

          2. loadProperss()信号;

          3. loadFinished()信号;

这里有个关键的东西,page(),返回web page对象。通过settings()函数可以对web页面进行修改(指开不开启JS这种);

访问某一网站,他会填充title(),icon()这种属性。

下面这幅图给出了QWebView和QWebPage以及QWebFrame之间的关系

这里可以知道:QWebView依赖于QtGui属性,如果他使用他,就要用QApplication创建主事件循环。如果使用QWebPage和QwebFrame直接用QCoreApplication创建主事件循环即可。

博主例子

一个简单的浏览网页的例子:

程序结构如下:

WebViewDemo.pro

#-------------------------------------------------
#
# Project created by QtCreator 2019-03-22T10:31:26
#
#-------------------------------------------------

QT       += core gui webkitwidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = WebViewDemo
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp \
    mypage.cpp

HEADERS  += widget.h \
    mypage.h

FORMS    += widget.ui

mypage.h

#ifndef MYPAGE_H
#define MYPAGE_H

#include <QWebPage>
#include <QNetworkRequest>
#include <QObject>

class MyPage : public QWebPage
{
    Q_OBJECT
public:
    MyPage(QObject *object = 0);

signals:
    void loadLink(const QUrl &url);
    void openLink(const QUrl &url);

protected:
    bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);
};

#endif // MYPAGE_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUrl>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected slots:
    void linkUrl(QUrl url);
    void openUrl(QUrl url);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

mypage.cpp

#include "mypage.h"

MyPage::MyPage(QObject *object) : QWebPage(object)
{

}

bool MyPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, QWebPage::NavigationType type)
{

    if(type==0)
    {//如果是用户点击
        if(frame!=mainFrame())
        { //如果不是在本窗口的连接
            emit openLink(request.url());//发送打开新连接信号
        }
        else
        {
            emit loadLink(request.url());//发送点击连接信号
        }
    }
    return QWebPage::acceptNavigationRequest(frame, request, type);
}

widget.cpp

#include "widget.h"
#include "mypage.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    MyPage *page = new MyPage;
    ui->webView->setPage(page);
    this->setWindowTitle("CSDN IT1995");
    ui->webView->load(QUrl("http://www.it1995.cn/"));
    connect(page, SIGNAL(linkClicked(QUrl)), this, SLOT(linkUrl(QUrl)));
    connect(page, SIGNAL(openLink(QUrl)), this, SLOT(openUrl(QUrl)));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::linkUrl(QUrl url)
{
    //qDebug() << url;
    ui->webView->load(url);
}

void Widget::openUrl(QUrl url)
{
    //qDebug() << url;
    ui->webView->load(url);
}

widget.ui

这个网站是可以随意点击的!

抓下包来分析下:

从这里可以看到不愧是调用内核accept-Language和connection,user-Aget都填充好了!

从user-Agent中的Applewebkit中可以知道的确是webkit,webviewDemo,这个就有点搞笑了!

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/88740051