Qt文档阅读笔记-QWebView官方解析与实例
目录
背景
最近发现某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("**** 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,这个就有点搞笑了!