QT 5.8 Webview 如何进行请求以及如何拦截它?
Posted
技术标签:
【中文标题】QT 5.8 Webview 如何进行请求以及如何拦截它?【英文标题】:QT 5.8 how does Webview do a request and how can I intercept it? 【发布时间】:2017-02-21 15:40:12 【问题描述】:我正在尝试将 QnetworkRequest 传递给位于我的 main.qml 文件中的 webView,而不是“url”。我通过引用 webView 对象和 setproperty 函数来传递 url。但是,还没有找到正确的函数,并且真的不知道从哪里开始创建新函数或修改现有的 webView 代码以使其正常工作。有没有办法将源代码编辑到 .qml 文件中的 webView。当然我只是在学习 QT 框架。
我尝试过 WebengineView,但 Webview 在加载页面时要快得多。这对应用程序至关重要
我想真正的问题是 Webview 是如何做一个请求的,我该如何拦截它?
main.qml
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtWebView 1.1
import QtQuick.Layouts 1.1
import QtQuick.Controls.Styles 1.2
ApplicationWindow
flags: Qt.FramelessWindowHint
visible: true
x: 600
y: 400
width: 500
height: 500
title: webView.title
WebView
id: webView
anchors.fill: parent
objectName: "webView"
//setting this value through main.cpp
// url: "https://www.google.com"
onLoadingChanged:
if (loadRequest.errorString)
console.error(loadRequest.errorString);
main.cpp
int main(int argc, char *argv[])
QGuiApplication app(argc, argv);
QtWebView::initialize();
QQmlApplicationEngine engine;
//How to Pass THIS request to the webview instead of url?
QNetworkRequest request;
request.setUrl(QUrl("http://google.com"));
request.setRawHeader("Accept-Charset", "UTF-8,*;q=0.5");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject *rootObject = engine.rootObjects().first();
QObject *qmlObject = rootObject->findChild<QObject*>("webView");
//Able to set the URL for the webView:
qmlObject->setProperty("url", "https://www.google.com" );
return app.exec();
【问题讨论】:
当WebView
的url
属性发生更改时,如何处理来自QML 的更改URL? onUrlChanged: ...
【参考方案1】:
AFAIK,所有 QML 组件都使用 QNetworkAccessManager。您可以注册自己的工厂,让您自己的班级处理网络。您可以重载get method 并在 url 与 google 匹配时更改标题,或者您想做的任何事情:
class MyNetworkManager : public QNetworkAccessManager
public:
QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)
if (request.url.contains("google"))
request.setRawHeader("Accept-Charset", "UTF-8,*;q=0.5");
return QNetworkAccessManager::get(request)
当然,这里request
是常量,所以你必须构造一个新请求,但我希望这能说明基本思想!
如何在main.cpp
注册自己的NetworkAccessManagerFactory的例子:
http://doc.qt.io/qt-5/qtqml-networkaccessmanagerfactory-example.html
【讨论】:
不幸的是,这不起作用。不调用重写的方法。似乎使用工厂我们只能得到文档中所写的内容:“通过实现工厂,可以为 QML 引擎提供具有专门缓存、代理和 cookie 支持的自定义 QNetworkAccessManager 实例。”以上是关于QT 5.8 Webview 如何进行请求以及如何拦截它?的主要内容,如果未能解决你的问题,请参考以下文章
Gif 动画不适用于 Qt 5.8 中的 Yocto Pyro。如何使用 libqgif.so 在 bitbake 中构建 qtbase 5.8?
如何在VS2015中使用PostgreSQL插件静态编译Qt 5.8