我试图将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();
}
afaik,所有qml组件均使用qnetworkAccessManager。您可以注册自己的工厂以让自己的班级处理网络。如果URL匹配Google或您想做的任何事情,则可以超载GET方法并更改标头:
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
是const,所以您必须构建一个新请求,但我希望这显示出基本的想法!
如何在main.cpp
中注册您自己的网络AccessManagerFactory的示例:
http://doc.qt.io/qt-5/qtqml-networkaccessmanagerfactory-example.html